AES - 在 Java 中用密文存储 IV

Jaw*_*Dev 2 java encryption

我已经实现了 CBC 模式 AES 加密和解密机制,其中我为每次推荐的加密尝试生成随机 IV 和随机密钥。

\n\n

现在,我已将密钥保存在一个单独的文件中,将 IV 保存在另一个文件中,但是在浏览不同的论坛后,我发现 IV 不应该保持安全,并且应在加密时和解密时附加密文我们可以从该密码字节数组中取出 16 个字节。

\n\n

现在,我尝试了一段代码来实现相同的目的,但结果并不好,因为第一个块没有正确加密;然而该块的其余部分却如此。

\n\n

有人可以告诉我我的方法有什么问题吗?

\n\n

任何帮助将不胜感激,谢谢:)。

\n\n
public static byte[] encrypt (byte[] plaintext,SecretKey key,byte[] IV ) throws Exception {\n\n        //Get Cipher Instance\n        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");\n\n        //Create SecretKeySpec\n        SecretKeySpec keySpec = new SecretKeySpec(key.getEncoded(), "AES");\n\n        //Create IvParameterSpec\n        IvParameterSpec ivSpec = new IvParameterSpec(IV);\n\n        System.out.println( "IV encrypt= " + ivSpec );\n\n        //Initialize Cipher for ENCRYPT_MODE\n        cipher.init(Cipher.ENCRYPT_MODE, keySpec);\n\n        //Perform Encryption\n        byte[] cipherText = cipher.doFinal(plaintext);\n\n        ByteArrayOutputStream b = new ByteArrayOutputStream();\n\n        b.write(IV);\n        b.write( cipherText );\n\n        return b.toByteArray();\n    }\n\n--------------------------------------------------------------------------\npublic static String decrypt (byte[] cipherText, SecretKey key ) throws Exception\n    {\n        //Get Cipher Instance\n        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");\n\n        //Create SecretKeySpec\n        SecretKeySpec keySpec = new SecretKeySpec(key.getEncoded(), "AES");\n\n        byte[] iv = Arrays.copyOfRange( cipherText , 0, 16);\n\n        //Create IvParameterSpec\n        IvParameterSpec ivSpec = new IvParameterSpec(iv);\n\n        //Initialize Cipher for DECRYPT_MODE\n        cipher.init(Cipher.DECRYPT_MODE, keySpec,ivSpec);\n\n        //Perform Decryption\n        byte[] decryptedText = cipher.doFinal(cipherText);\n\n        return new String(decryptedText);\n    }\n\n----------------------------------------------------------------------------\n\nKeyGenerator keyGenerator = KeyGenerator.getInstance("AES");\n        keyGenerator.init(128);\n\n        // Generate Key\n        SecretKey key = keyGenerator.generateKey();\n\n        // Generating IV.\n        byte[] IV = new byte[16];\n        SecureRandom random = new SecureRandom();\n        random.nextBytes(IV);\n\n        System.out.println("Original Text  : " + plainText);\n\n        byte[] cipherText = encrypt(plainText.getBytes("UTF-8") ,key, IV);\n\n\n\n        String decryptedText = decrypt(cipherText,key, IV);\n        System.out.println("DeCrypted Text : "+decryptedText);\n
Run Code Online (Sandbox Code Playgroud)\n\n

结果

\n\n
Original Text  : This is a plain text which need to be encrypted by AES Algorithm with CBC Mode\nDeCrypted Text : \xc3\xbb\xc2\xaa\xc2\xaf\xc3\x8e\xc2\xa5pA\xc3\xaf2E\xc3\x9ei+\xc2\xbc\xe2\x80\xb9\xc3\x9d$8\xc3\x85\xc2\xb6\xc3\x84DDN\xc3\xa2O\xc3\xa6\xc3\xa0text which need to be encrypted by AES Algorithm with CBC Mode\n
Run Code Online (Sandbox Code Playgroud)\n

Luk*_*ark 5

只是因为你在这里复制了 IV:

byte[] iv = Arrays.copyOfRange( cipherText , 0, 16);
Run Code Online (Sandbox Code Playgroud)

并不意味着当您尝试在以下期间解密它时它不仍然存在:

byte[] decryptedText = cipher.doFinal(cipherText);
Run Code Online (Sandbox Code Playgroud)

您应该解密除前 16 个字节ciphertext 之外的所有内容。目前,您还在 IV 上执行 AES 解密 - 这就是您收到垃圾的原因。