我想使用PKCS#11和SafeNet HSM设备加密大量的明文。当我一个一个地加密每一个明文时,需要很长时间。
因此,我突然想到,在PKCS#11中是否有任何方法可以同时加密多个数据?
我在SafeNet C编程手册中找到了下面的多部分数据加密示例,该手册使用PKCS #11 API。
/* 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,继续进行多部分加密操作,处理另一个数据部分.
我想知道这种方法是否可以一次加密多个明文,还是将所有的缓冲区元素都当作相同输入数据的块来考虑?
我正在寻找一种解决方案,它可以加密多个明文,但将它们视为单独的项(而不是大的单个项的块)。
发布于 2021-10-13 07:59:19
它将把所有数据视为一个输入的块。它用于将数据加密为流。因此,如果您认为可以使用它并行化您的加密过程,那么您就错了。
顺便说一句,你用什么机制来加密?不要告诉我,您只是直接使用不对称算法(如RSA)。如果您这样做,这就是为什么您的加密过程非常缓慢。
更新:
在我头上,你可以试试这样的方法:
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卡。
发布于 2021-10-18 01:47:28
我有一个解决方案给你,这有两个部分:
中的线程。
中只加密一次
-在你的硬件中(# CP‘s)运行一个程序来加密Whit AES256 -但是使用HSM作为一个令牌或numberRandom,这将是我们的盐。
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端完成。
https://stackoverflow.com/questions/69551674
复制相似问题