我遇到了 java 安全问题。我有一堆字节,我想把它们分成 N 个字节的块,加密它们,然后在单独的(独立的)消息中发送它们。
这是我的基本加密内容:
private byte[] generateIv(int size) {
byte[] iv = new byte[size];
randomSecureRandom.nextBytes(iv);
return iv;
}
@Override
public byte[] encryptData(byte[] iv, byte[] in, Key key) throws CryptoException {
try {
Cipher c = Cipher.getInstance("AES/CTR/PKCS5Padding");
c.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(iv));
return c.doFinal(in);
} catch (Exception ex) {
throw new CryptoException(ex);
}
}
@Override
public byte[] decryptData(byte[] iv, byte[] in, Key key) throws CryptoException {
try {
Cipher c = Cipher.getInstance("AES/CTR/PKCS5Padding");
c.init(Cipher.DECRYPT_MODE,key, new IvParameterSpec(iv));
return c.doFinal(in);
} catch(Exception ex) {
throw new CryptoException(ex);
}
}
@Override
public byte[] createHMAC(byte[] pauload, Key sigKey) throws CryptoException {
try {
Mac mac = Mac.getInstance("HMACSHA256");
mac.init(sigKey);
byte[] digest = mac.doFinal(pauload);
return digest;
} catch (Exception e) {
throw new CryptoException("unable to create HMAC",e);
}
}
我创建这样的消息(在初始握手中生成 AES-128 会话密钥):
byte[] iv = generateIv();
byte[] hmac = createHMAC (inputBytes,key);
byte[] enc = encryptData(iv,inputBytes,key);
然后我在消息中写道:
[iv bytes][enc bytes][hmac bytes]
在另一边,我这样做:
byte[] iv = readFirstEightBytes(inputBytes);
byte[] dec = decryptData(iv,inputBytes[8..N+8],key);
byte[] hmac = createHMAC(dec,inputBytes[N+9..end],key);
// compare hmac
return dec;
这一切都很好而且蓬松,除了当我开始锤它时,它往往真的,真的,很慢。我的热点是:
encryptData 27%
createHMAC 22%
decryptData 18%
我想知道我在这里是不是很天真?我错过了一些明显的东西吗?我想知道我是否不应该每次都得到一个新的 Cipher 实例......但是我有很多并发性,我猜想尝试共享实例线程安全可能也不理想......
我看到我的其余代码有很大的改进空间,所以这会使加密部分看起来更糟。
谁有想法?还是 20 mb/s 的总吞吐量和它得到的一样好(在现代、强大的笔记本电脑上)?