首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PKCS#11:多明文加密

PKCS#11:多明文加密
EN

Stack Overflow用户
提问于 2021-10-13 07:55:03
回答 2查看 266关注 0票数 0

我想使用PKCS#11和SafeNet HSM设备加密大量的明文。当我一个一个地加密每一个明文时,需要很长时间。

因此,我突然想到,在PKCS#11中是否有任何方法可以同时加密多个数据?

我在SafeNet C编程手册中找到了下面的多部分数据加密示例,该手册使用PKCS #11 API。

代码语言:javascript
复制
/* read, encrypt, digest and write the cipher text in chunks
*/ totbw = 0;
for ( ;; ) {
    br = fread(buffer, 1, sizeof(buffer), ifp);
    if ( br == 0 )
        break;
    
    /* digest */

    /* encrypt */
    curLen = sizeof(encbuffer);
    rv = C_EncryptUpdate(hrSession, buffer, (CK_SIZE)br, encbuffer, &curLen);
    CHECK_RV(FN "C_EncryptUpdate", rv);
    if (rv) return 1;
    
    /* write cipher text */
    br = fwrite(encbuffer, 1, (int)curLen, ofp);
    totbw += br;
}

该手册中提到:

对于加密,我们使用C_EncryptUpdate,继续进行多部分加密操作,处理另一个数据部分.

我想知道这种方法是否可以一次加密多个明文,还是将所有的缓冲区元素都当作相同输入数据的块来考虑?

我正在寻找一种解决方案,它可以加密多个明文,但将它们视为单独的项(而不是大的单个项的块)。

EN

回答 2

Stack Overflow用户

发布于 2021-10-13 07:59:19

它将把所有数据视为一个输入的块。它用于将数据加密为流。因此,如果您认为可以使用它并行化您的加密过程,那么您就错了。

顺便说一句,你用什么机制来加密?不要告诉我,您只是直接使用不对称算法(如RSA)。如果您这样做,这就是为什么您的加密过程非常缓慢。

更新:

在我头上,你可以试试这样的方法:

代码语言:javascript
复制
1-Genrate a random number using C_GenerateRandom.
2-Encrypt this random using HSM.
3-Use this encrypted random to encrypt your data locally.
4-Send encrypted data and non-encrypted random number to other side.

另一方可以对接收到的随机加密密钥进行加密,对接收到的加密数据进行解密。

我应该说,这是一个30秒的设计,它应该考虑其他关键部分(如时间戳)。但我想展示如何做到这一点,而不过度使用你的HSM卡。

票数 2
EN

Stack Overflow用户

发布于 2021-10-18 01:47:28

我有一个解决方案给你,这有两个部分:

    1. encrypt在你的硬件中。这将解析JAVA.

中的线程。

    1. Use盐概念由HSM在您的加密program.

中只加密一次

-在你的硬件中(# CP‘s)运行一个程序来加密Whit AES256 -但是使用HSM作为一个令牌或numberRandom,这将是我们的盐。

代码语言:javascript
复制
    import java.io.Serializable;
    import java.nio.charset.StandardCharsets;
    import java.security.spec.KeySpec;
    import java.util.Base64;
    import javax.crypto.Cipher;
    import javax.crypto.SecretKey;
    import javax.crypto.SecretKeyFactory;
    import javax.crypto.spec.IvParameterSpec;
    import javax.crypto.spec.PBEKeySpec;
    import javax.crypto.spec.SecretKeySpec;

    public class Encrypt implements Serializable {

        private static final String secretKeyAES = "My_Long_bytes_to_cipher";
        private static final String saltAES = "My_Salt_only_one_time_for_20M_ByHMS_Random";

        public Encrypt() {
}

public String getAES(String data) {
    try {
        byte[] iv = new byte[16];
        IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);
        SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
        KeySpec keySpec = new PBEKeySpec(secretKeyAES.toCharArray(), saltAES.getBytes(), 65536, 256);
        SecretKey secretKeyTemp = secretKeyFactory.generateSecret(keySpec);
        SecretKeySpec secretKey = new SecretKeySpec(secretKeyTemp.getEncoded(), "AES");
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivParameterSpec);
        return Base64.getEncoder().encodeToString(cipher.doFinal(data.getBytes("UTF-8")));
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

public String getAESDecrypt(String data) {
    byte[] iv = new byte[16];
    try {
        IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);
        SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
        KeySpec keySpec = new PBEKeySpec(secretKeyAES.toCharArray(), saltAES.getBytes(), 65536, 256);
        SecretKey secretKeyTemp = secretKeyFactory.generateSecret(keySpec);
        SecretKeySpec secretKey = new SecretKeySpec(secretKeyTemp.getEncoded(), "AES");
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, secretKey, ivParameterSpec);
        return new String(cipher.doFinal(Base64.getDecoder().decode(data)));
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}
    }

-这个答案解决了HSM请求,但是现在你应该用JAVA来解决这个问题。

大部分处理将在CPU端完成。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69551674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档