Java使用aes256 / CBC / PKCS7Padding加密文件

Majlena

我正在尝试使用aes256- CBC-PKCS7Padding加密文件。我正在使用充气城堡库,但出现异常

java.lang.IllegalArgumentException: invalid parameter passed to AES init - org.bouncycastle.crypto.params.ParametersWithIV
at org.bouncycastle.crypto.engines.AESEngine.init(Unknown Source)
at org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher.init(Unknown Source)

这里的源代码:

public class Crypto {

    public static final int AES_Key_Size = 256;
    public static int blockSize = 16;
    private final BlockCipher AESCipher = new AESEngine();
    private PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(AESCipher, new PKCS7Padding());
    private byte[] IV;
    private KeyParameter key;

    public Crypto() throws NoSuchAlgorithmException {
        KeyGenerator kg = KeyGenerator.getInstance("AES");
        kg.init(AES_Key_Size);
        SecretKey sk = kg.generateKey();
        key = new KeyParameter(sk.getEncoded());


    }
    public void CryptoZip(File plikZip, File plikAES) throws IOException, DataLengthException, IllegalStateException, InvalidCipherTextException {

        byte[] input = Files.readAllBytes(plikZip.toPath());
        byte[] cryptOut = encrypt(input);
        FileOutputStream fos = new FileOutputStream(plikAES);
        fos.write(cryptOut);
        fos.close();



    }


    private byte[] encrypt(byte[] input) throws DataLengthException, IllegalStateException, InvalidCipherTextException {



        IV = new byte[blockSize];
        SecureRandom random = new SecureRandom();
        random.nextBytes(IV);

        cipher.init(true, new ParametersWithIV(key, IV)); // problem here


        byte[] output = new byte[cipher.getOutputSize(input.length)];
        int bytesWrittenOut = cipher.processBytes(
            input, 0, input.length, output, 0);

        cipher.doFinal(output, bytesWrittenOut);

        return output;

    }
}

关于如何解决它和解释我做错了什么的任何建议都将非常有帮助。

马丁·波德维斯(Maarten Bodewes)

您所缺少的是该模式的指示。如果缺少该选项,则假定为ECB模式,并且ECB模式不使用IV。所以PaddedBufferedBlockCipher确实做缓冲,但对于ECB模式。因此init模式仅将参数传递给AESEngine,并AESEngine拒绝IV,因为它仅接受键。

在您的代码中,以下内容将直接解决该问题:

private final CBCBlockCipher AESCipherCBC = new CBCBlockCipher(AESCipher);
private final PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(AESCipherCBC, new PKCS7Padding());

我将包括以下重写,以向您显示一种不同的记录方式。请注意,我没有正确处理IV或异常。显然,对于大文件,您可能需要流式传输内容和/或映射文件。

// renamed as crypto is a horrible name
public class FileEncryptor {

    // lets use all uppercase constant names
    public static final int AES_KEY_SIZE = 256;

    // only field needed, the rest can be generated on the fly
    private final KeyParameter key;

    public FileEncryptor() throws NoSuchAlgorithmException {
        key = generateKey();
    }

    private static KeyParameter generateKey() {
        // removed KeyGenerator as that's dependent on JCA crypto-API 
        SecureRandom keyRNG = new SecureRandom();
        byte[] keyData = new byte[AES_KEY_SIZE / Byte.SIZE];
        keyRNG.nextBytes(keyData);
        return new KeyParameter(keyData);
    }

    // the code doesn't do anything with zip itself, so no need to include it in the method name
    public void encryptFile(File plaintextFile, File ciphertextFile) throws IOException, DataLengthException, IllegalStateException, InvalidCipherTextException {
        byte[] plaintext = Files.readAllBytes(plaintextFile.toPath());
        byte[] ciphertext = encrypt(plaintext);
        // try and be symmetric, use Files functionality for reading *and writing*
        Files.write(ciphertextFile.toPath(), ciphertext);
    }


    private byte[] encrypt(byte[] plaintext) throws DataLengthException, IllegalStateException, InvalidCipherTextException {
        // create cipher
        final BlockCipher aes = new AESFastEngine();
        CBCBlockCipher aesCBC = new CBCBlockCipher(aes);
        PaddedBufferedBlockCipher aesCBCPadded =
                new PaddedBufferedBlockCipher(aesCBC, new PKCS7Padding());

        // create IV
        byte[] iv = new byte[aes.getBlockSize()];
        SecureRandom random = new SecureRandom();
        random.nextBytes(iv);

        // initialize cipher with IV
        ParametersWithIV paramsWithIV = new ParametersWithIV(key, iv);
        aesCBCPadded.init(true, paramsWithIV); // problem here

        // encrypt
        byte[] ciphertext = new byte[aesCBCPadded.getOutputSize(plaintext.length)];
        int bytesWrittenOut = aesCBCPadded.processBytes(
            plaintext, 0, plaintext.length, ciphertext, 0);
        aesCBCPadded.doFinal(ciphertext, bytesWrittenOut);

        // that's great, but where is your IV now? you need to include it in the returned ciphertext!
        return ciphertext;
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用 AES/CBC/PKCS7Padding 加密/解密

来自分类Dev

将文本加密为AES / CBC / PKCS7Padding

来自分类Dev

Java Encrypt a file using aes256/ CBC/PKCS7Padding

来自分类Dev

AES / CBC / PKCS5Padding与AES / CBC / PKCS7Padding具有256键大小的性能Java

来自分类Dev

使用PKCS7Padding进行AES CBC加密在Java和Objective-C中具有不同的结果

来自分类Dev

使用PKCS7Padding进行AES CBC加密在Java和Objective-C中具有不同的结果

来自分类Dev

在iOS中使用AES / CBC / PKCS7Padding 128位算法在Android中加密的解密字符串的问题

来自分类Dev

矢量不随 Java 中的“AES/CBC/pkcs7padding”而改变

来自分类Dev

AES / cbc / pkcs5padding加密IOS

来自分类Dev

在Dart中解密AES / CBC / PKCS5Padding加密

来自分类Dev

AES-256-CBC 用 PHP 加密并用 Java 解密

来自分类Dev

使用AES-256-CBC的加密文本的长度

来自分类Dev

如何使用OpenSSL加密/解密AES-256 CBC?

来自分类Dev

VBA AES CBC加密

来自分类Dev

Android / Java AES 256 CBC与PHP中的PKCS5Padding解密

来自分类Dev

Android / Java AES 256 CBC与PHP中的PKCS5Padding解密

来自分类Dev

C#中的Java AES / CBC / PKCS5Padding

来自分类Dev

使用CryptoJS解密AES / CBC / PKCS5Padding

来自分类Dev

如何在dart中使用AES CBC 256位和PKCS5Padding进行加密和解密以及如何检索参数

来自分类Dev

从ColdFusion加密解密NodeJS中的AES / CBC / PKCS5Padding

来自分类Dev

无法解密在服务器端使用OpenSSL AES 256 CBC加密的文件

来自分类Dev

无法解密在服务器端使用OpenSSL AES 256 CBC加密的文件

来自分类Dev

AES-256和PKCS7Padding在Java中失败

来自分类Dev

PHP中的AES / CBC / PKCS#5加密算法

来自分类Dev

Ruby中的Coldfusion“ AES / CBC / PKCS5Padding”解密

来自分类Dev

AES 256 位 CBC PKCS#5 在 Python 中加密/解密

来自分类Dev

Flutter / Dart AES-256-CBC从PHP中的加密解密

来自分类Dev

Node.js AES-256-CBC加密问题

来自分类Dev

错误的加密(QT c++ OpenSSL AES 256 CBC)

Related 相关文章

  1. 1

    使用 AES/CBC/PKCS7Padding 加密/解密

  2. 2

    将文本加密为AES / CBC / PKCS7Padding

  3. 3

    Java Encrypt a file using aes256/ CBC/PKCS7Padding

  4. 4

    AES / CBC / PKCS5Padding与AES / CBC / PKCS7Padding具有256键大小的性能Java

  5. 5

    使用PKCS7Padding进行AES CBC加密在Java和Objective-C中具有不同的结果

  6. 6

    使用PKCS7Padding进行AES CBC加密在Java和Objective-C中具有不同的结果

  7. 7

    在iOS中使用AES / CBC / PKCS7Padding 128位算法在Android中加密的解密字符串的问题

  8. 8

    矢量不随 Java 中的“AES/CBC/pkcs7padding”而改变

  9. 9

    AES / cbc / pkcs5padding加密IOS

  10. 10

    在Dart中解密AES / CBC / PKCS5Padding加密

  11. 11

    AES-256-CBC 用 PHP 加密并用 Java 解密

  12. 12

    使用AES-256-CBC的加密文本的长度

  13. 13

    如何使用OpenSSL加密/解密AES-256 CBC?

  14. 14

    VBA AES CBC加密

  15. 15

    Android / Java AES 256 CBC与PHP中的PKCS5Padding解密

  16. 16

    Android / Java AES 256 CBC与PHP中的PKCS5Padding解密

  17. 17

    C#中的Java AES / CBC / PKCS5Padding

  18. 18

    使用CryptoJS解密AES / CBC / PKCS5Padding

  19. 19

    如何在dart中使用AES CBC 256位和PKCS5Padding进行加密和解密以及如何检索参数

  20. 20

    从ColdFusion加密解密NodeJS中的AES / CBC / PKCS5Padding

  21. 21

    无法解密在服务器端使用OpenSSL AES 256 CBC加密的文件

  22. 22

    无法解密在服务器端使用OpenSSL AES 256 CBC加密的文件

  23. 23

    AES-256和PKCS7Padding在Java中失败

  24. 24

    PHP中的AES / CBC / PKCS#5加密算法

  25. 25

    Ruby中的Coldfusion“ AES / CBC / PKCS5Padding”解密

  26. 26

    AES 256 位 CBC PKCS#5 在 Python 中加密/解密

  27. 27

    Flutter / Dart AES-256-CBC从PHP中的加密解密

  28. 28

    Node.js AES-256-CBC加密问题

  29. 29

    错误的加密(QT c++ OpenSSL AES 256 CBC)

热门标签

归档