Я использую приведенный ниже код JAVA для шифрования простого текста, который будет создавать зашифрованный текст, а затем расшифровывать этот зашифрованный текст с помощью ключа (который генерируется с помощью getSecretEncryptionKey (). GetEncoded () в файле JAVA) в коде C ++.
КОД JAVA:
public byte[] encryptDecrypt(String jsonData, String publicKey) throws Exception
{
Security.addProvider(new BouncyCastleProvider());
SecretKey secKey = getSecretEncryptionKey();
cipherText = encryptText(jsonData, secKey);
return cipherText;
}
public static SecretKey getSecretEncryptionKey() throws Exception
{
KeyGenerator generator = KeyGenerator.getInstance("AES");
generator.init(256);
SecretKey secKey = generator.generateKey();
return secKey;
}
public static byte[] encryptText(String plainText, SecretKey secKey) throws Exception
{
// AES defaults to AES/ECB/PKCS5Padding in Java 7
SecretKeySpec skeySpec = new SecretKeySpec(secKey.getEncoded(), "AES/ECB/PKCS7Padding");
Cipher aesCipher = Cipher.getInstance("AES/ECB/PKCS7Padding");
aesCipher.init(Cipher.ENCRYPT_MODE, skeySpec);
return aesCipher.doFinal(plainText.getBytes());
}
C ++ КОД:
INT32 Security::decrypt(UINT8 *ciphertext, INT32 ciphertext_len, UINT8 *key,
UINT8 *iv, UINT8 *plaintext)
{
EVP_CIPHER_CTX *ctx;
INT32 len;
INT32 plaintext_len;
/* Create and initialise the context */
if(!(ctx = EVP_CIPHER_CTX_new())) handleErrors();
if (!EVP_DecryptInit_ex(ctx, EVP_aes_256_ecb(), 0, key, NULL)) {
printf("\n ERROR!! \n");
return -1;
}
/* Provide the message to be decrypted, and obtain the plaintext output.
* EVP_DecryptUpdate can be called multiple times if necessary
*/
if(1 != EVP_DecryptUpdate(ctx, plaintext, &len, ciphertext, ciphertext_len))
handleErrors();
plaintext_len = len;
/* Finalise the decryption. Further plaintext bytes may be written at
* this stage.
*/
if(1 != EVP_DecryptFinal_ex(ctx, plaintext + len, &len)) handleErrors();
plaintext_len += len;
/* Clean up */
EVP_CIPHER_CTX_free(ctx);
return plaintext_len;
}
При дешифровании CipherText с использованием Key, код C ++ генерирует ошибку сегментации и выдает ошибку ниже:
140159077054088: ошибка: 06065064: подпрограммы цифрового конверта: EVP_DecryptFinal_ex: плохая расшифровка: evp_enc.c: 596:
Прервано (ядро сброшено)
Я новичок в этой области, поэтому, пожалуйста, помогите мне.
Задача ещё не решена.
Других решений пока нет …