【问题标题】:Decrypting text file in openssl:-Error:EVP_DecryptFinal_ex:wrong final block length:evp_enc.c:518:在 openssl 中解密文本文件:-错误:EVP_DecryptFinal_ex:错误的最终块长度:evp_enc.c:518:
【发布时间】:2017-12-20 11:52:01
【问题描述】:

我正在编写一个小型应用程序来了解加密/解密的更多信息。 从我的代码中,我生成 AES 密钥,然后使用 AES 密钥加密文本文件。之后,我使用 RSA 公钥加密 AES 密钥。

下面是代码sn-p

SecretKey secretAesKey ;
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(256);
secretAesKey = keyGen.generateKey();
if (secretAesKey != null) {
    Cipher aesCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    aesCipher.init(Cipher.ENCRYPT_MODE, secretAesKey);
    long aesEncryptStartTime = SystemClock.elapsedRealtime();
    CipherInputStream aesCis = new CipherInputStream(fis, aesCipher);
    int read;
    byte[] buffer = new byte[4096];
    while ((read = aesCis.read(buffer)) != -1) {
        aesFos.write(buffer, 0, read);
        aesFos.flush();
    }

    // Encrypt the generated key
    if (!encKeyFile.exists()) {
        encKeyFile.createNewFile();
    }

    try {
        byte[] encryptedAesKey = null;
        Cipher rsaCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
        rsaCipher.init(Cipher.ENCRYPT_MODE, readRsaPublicKeyFromResource(context));
        encryptedAesKey = rsaCipher.doFinal(secretAesKey.getEncoded());
        rsaFos.write(encryptedAesKey);
        rsaFos.flush();
    } catch (Exception e) {
        Log.e(LOG_TAG, "RSA encryption error", e);
    } finally {
        rsaFos.close();
    }

在解密过程中首先使用 RSA 私钥解密 AES 密钥,从以下代码

FileInputStream keyFis = new FileInputStream(encKeyFile);
byte[] encKey = new byte[keyFis.available()];
keyFis.read(encKey);
keyFis.close();

SecretKey key = null;
PrivateKey privKey = readRsaPrivateKeyFromResource(context);
Cipher cipher = null;

try
{
    // initialize the cipher...
    cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
    cipher.init(Cipher.DECRYPT_MODE, privKey);
    // generate the aes key!
    key = new SecretKeySpec (cipher.doFinal(encKey), "AES" );
    String stringKey = Base64.encodeToString(key.getEncoded(), Base64.DEFAULT);
    try {
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(context.openFileOutput("aesDecrypted.key", Context.MODE_PRIVATE));
        outputStreamWriter.write(stringKey);
        outputStreamWriter.close();
    }
    catch (IOException e) {
        Log.e("Exception", "File write failed: " + e.toString());
    }

我正在获取解密的 AES 密钥,例如“ah3ZWMieji6KtSav6gaayTvsEID2vpp589wdChTLmZs="

转换成十六进制值后如下。 “6A1DD958C89E8E2E8AB526AFEA069AC93BEC1080F6BE9A79F3DC1D0A14CB999B”

尝试在终端中使用生成的十六进制密钥解密文本文件 例如:

openssl aes-256-cbc -d -a -iv 0 -in encrypt.txt -out decrypt.txt -K 6A1DD958C89E8E2E8AB526AFEA069AC93BEC1080F6BE9A79F3DC1D0A14CB999B

我收到以下错误

错误的解密 7560:错误:0606506D:数字信封例程:EVP_DecryptFinal_ex:错误的最终块长度:evp_enc.c:518:

为什么会这样,更进一步,我做错了什么?

如果有人能提供帮助,我将非常感激。

【问题讨论】:

    标签: java android encryption openssl


    【解决方案1】:

    您的代码有多个问题,这里是一个非详尽的列表:

    • Java 自动为您生成一个随机 IV,但您忘记保存它以供解密 (cipher.getParameters().getParameterSpec(IvParameterSpec.class));)。 IV不是秘密。通常与密文一起发送。

    • 使用keyFis.available() 是个坏主意,因为流不会告诉您底层文件有多大,而是告诉您在其内部缓冲区中还剩下多少字节。使用不同的技术来获取文件的大小。

    • 您已尝试实施混合加密。解密时需要逆过程:先用RSA解密AES密钥,再用AES解密实际数据。

    【讨论】:

    • 我尝试使用以下语句检查生成的密钥 String stringKey = Base64.encodeToString(secretAesKey.getEncoded(), Base64.DEFAULT);这与解密 AES 密钥后得到的相同。你能详细说明一下保存随机 IV 密钥吗?
    • 我做到了:aesCipher.getParameters().getParameterSpec(IvParameterSpec.class)).getIV();
    • 我尝试添加在openssl指令IV键: - “OpenSSL的AES-256-CBC -d -a -iv 0037AC1DA2C0CE1C66AC3BF88D39ED92 -in encrypt.txt -out final.txt -K F6082422EC05FA3DC25E3FE6349401EFE6897581A99CF43A6486466B641D7C98” 坏解密2780:错误:0606506D:数字信封例程:EVP_DecryptFinal_ex:错误的最终块长度:evp_enc.c:518:仍然没有运气。
    • @Pause option -a in openssl 表示文件是base64 ..但是你的AES加密文件不在base64 ..
    猜你喜欢
    • 1970-01-01
    • 2014-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-31
    • 1970-01-01
    • 2015-06-30
    • 2017-10-11
    相关资源
    最近更新 更多