在openssl中解密文本文件:-错误:EVP_DecryptFinal_ex:错误的最终块长度:evp_enc.c:5



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

下面是代码片段

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 会自动为您生成一个随机 IV,但您忘记保存它以进行解密 (cipher.getParameters().getParameterSpec(IvParameterSpec.class));(。IV不是秘密。通常,它与密文一起发送。

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

  • 你已尝试实现混合加密。解密时,您需要反向处理:首先使用 RSA 解密 AES 密钥,然后使用 AES 解密实际数据。

最新更新