0

我有一个存储在字符串中的 XML。我需要使用会话密钥(AES 和 256 位)对其进行加密。

我正在使用以下代码生成密钥:

public byte[] generateSessionKey() throws NoSuchAlgorithmException, NoSuchProviderException
{
    KeyGenerator kgen = KeyGenerator.getInstance("AES","BC");
    kgen.init(SYMMETRIC_KEY_SIZE);
    SecretKey key = kgen.generateKey();
    byte[] symmKey = key.getEncoded();
    return symmKey;
}

使用以下代码使用会话密钥加密数据:

public byte[] encryptUsingSessionKey(byte[] skey, byte[] data) throws InvalidCipherTextException
{
    PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new AESEngine(), new PKCS7Padding());

     cipher.init(true, new KeyParameter(skey));

     int outputSize = cipher.getOutputSize(data.length);

     byte[] tempOP = new byte[outputSize];
     int processLen = cipher.processBytes(data, 0, data.length, tempOP, 0);
     int outputLen = cipher.doFinal(tempOP, processLen);

     byte[] result = new byte[processLen + outputLen];
     System.arraycopy(tempOP, 0, result, 0, result.length);
     return result;
}

所以,我想知道,我这样做是对还是错?

4

1 回答 1

0

会话密钥是否私有,如果不是,则存在安全问题。

您没有指定加密模式,最好是明确的。

由于似乎没有 iv 并且没有指定模式,因此假设模式是不安全的 ECB 模式,最好使用 CBC 模式,在加密数据之前添加一个随机 iv,以便在解密期间使用。

还缺少加密认证和密钥生成弱,最好使用派生函数,如 PBKDF2。

不要使用 ECB 模式,这是不安全的,请参阅ECB 模式,向下滚动到企鹅。

考虑使用更完整的库,例如 RNCryptor 的JMCryptor,其中包括 PBKDF2 密钥派生、加密身份验证、随机 iv 和版本控制。另请参阅RNCryptor 规范了解更多信息。

于 2016-07-13T13:40:18.590 回答