【发布时间】: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