DES encrypt в C / C++ vs Java



Просто интересно, почему один и тот же простой текст, зашифрованный в Java и C, не генерирует один и тот же зашифрованный текст.
Для DES algo я заметил



Вход text = "text", key = "test"



C шифрованный текст len = 24
Java генерирует зашифрованный текст len = 8



Для 256Bit AES я заметил аналогичную разницу

C шифрованный текст len = 32
Java генерирует зашифрованный текст len = 16



Вот мой" C " код



char* enc(const char* text, const char* keyStr)
{
EVP_CIPHER_CTX ctx;
unsigned char key[32] = {0};
unsigned char iv[16] = {0};
unsigned char in[16] = {0};
unsigned char out[32]; /* at least one block longer than in[] */
memset(out, 0, 32);
int outlen1, outlen2;

memcpy(in, text, strlen(text));
memcpy(key, keyStr, strlen(keyStr));

EVP_EncryptInit(&ctx, EVP_aes_256_cbc(), key, iv);
EVP_EncryptUpdate(&ctx, out, &outlen1, in, sizeof(in));
EVP_EncryptFinal(&ctx, out + outlen1, &outlen2);

char* ret = (char*)malloc(outlen1 + outlen2+1);
memset(ret, 0, outlen1 + outlen2+1);
memcpy(ret, out, outlen1 + outlen2);

EVP_CIPHER_CTX_cleanup(&ctx);

return ret;
}


Вот код "Java"



public static byte[] enc(byte[] input, byte[] keyStr){
byte[] output = null;

try {
byte[] newKey = getByteArrays(keyStr, 0, 32);
SecretKey secretKey = new SecretKeySpec(newKey, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
//Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
String ivStr = "";
byte[] ivKey = getByteArrays(ivStr.getBytes("UTF-8"), 0, 16);
IvParameterSpec ips = new IvParameterSpec(ivKey);
cipher.init(Cipher.ENCRYPT_MODE, secretKey, ips, null);
output = cipher.doFinal(input);

} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return output;
}


У меня есть список записей, зашифрованных с помощью C , я хочу расшифровать эти записи в Ява.



Обновлено

следующее обновление помогло получить одинаковую длину, как в 'C', так и в'JAVA'



EVP_EncryptUpdate(&CTX, от и outlen1, в, функция strlen(текст));



Нет, просто интересно, почему шифротекст, возвращаемый "C" и "JAVA", отличается для одного и того же текста и ключа, я ожидаю, что они будут одинаковыми

531   1  

1 ответ:

Причина, по которой код C выводит 32 байта зашифрованного текста, заключается в том, что вы заполняете входную строку нулямиПеред тем, как передать ее в функцию шифрования.

В этой строке:

EVP_EncryptUpdate(&ctx, out, &outlen1, in, sizeof(in));

Функция понятия не имеет, что вы заполнили свои данные нулями. Поскольку sizeof(in) равно 16, он принимает 16 как длину вашего открытого текста. И с заполнением PKCS5 (и AES), 16 байт будут заполнять до 32 байт.

В коде Java вы не вводили данные вручную, а просто передавали их сразу перейдем к функции шифрования. Таким образом, функция шифрования видит размер вашего открытого текста в 4 байта, который дополняется до 16 с помощью pkcs5.

Таким образом, ваше решение просто: не вводите вручную свой ввод в C-код. Просто передайте открытый текст непосредственно в EVP_EncryptUpdate. Он уже разработан для работы с незаполненным открытым текстом.

Comments

    Ничего не найдено.