2

我遇到了 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 的总吞吐量和它得到的一样好(在现代、强大的笔记本电脑上)?

4

0 回答 0