Sadece bu 3 mod ile openSSL'den AES'yi test etmek istiyorum: 128,192 ve 256 anahtar uzunluğu ile Şifresi çözülmüş metin girdimden farklı ve nedenini bilmiyorum. Ayrıca, büyük bir giriş uzunluğunu geçtiğimde (1024 bayt diyelim) programım core dumped
gösterir ... Benim girişim her zaman aynıdır, ama en azından şimdilik önemli değil. İşte kod:AES (aes-cbc-128, aes-cbc-192, aes-cbc-256) openssl ile şifreleme/şifre çözme C
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/aes.h>
int main(int argc, char **argv)
{
int i;
int keylength;
printf("Give a key length [only 128 or 192 or 256!]:\n");
scanf("%d", &keylength);
/* generate a key with a given length */
unsigned char aes_key[keylength];
memset(aes_key, 0, sizeof(aes_key));
if (!RAND_bytes(aes_key, keylength))
{
exit(-1);
}
aes_key[keylength-1] = '\0';
int inputslength;
printf("Give an input's length:\n");
scanf("%d", &inputslength);
/* generate input with a given length */
unsigned char aes_input[inputslength+1];
memset(aes_input, '0', sizeof(aes_input));
aes_input[inputslength] = '\0';
/*printf("original:\t");
for(i=0; i<inputslength; i++)
{
printf("%c ", aes_input[i]);
}
printf("\n");*/
/* init vector */
unsigned char iv[AES_BLOCK_SIZE];
if (!RAND_bytes(iv, AES_BLOCK_SIZE))
{
exit(-1);
}
//printf("AES_BLOCK_SIZE = %d\n", AES_BLOCK_SIZE); // aes block size is 16 bytes = 128 bits
AES_KEY enc_key, dec_key;
unsigned char enc_out[AES_BLOCK_SIZE];
unsigned char dec_out[AES_BLOCK_SIZE];
// so i can do with this aes-cbc-128 aes-cbc-192 aes-cbc-256
AES_set_encrypt_key(aes_key, keylength, &enc_key);
AES_cbc_encrypt(aes_input, enc_out, inputslength, &enc_key, iv, AES_ENCRYPT);
AES_set_decrypt_key(aes_key, keylength, &dec_key);
AES_decrypt(enc_out, dec_out, &dec_key);
printf("original:\t");
for(i=0;*(aes_input+i)!=0x00;i++)
printf("%X ",*(aes_input+i));
printf("\nencrypted:\t");
for(i=0;*(enc_out+i)!=0x00;i++)
printf("%X ",*(enc_out+i));
printf("\ndecrypted:\t");
for(i=0;*(dec_out+i)!=0x00;i++)
printf("%X ",*(dec_out+i));
printf("\n");
/*printf("\n\noriginal:\t");
for(i=0; i<inputslength; i++)
{
printf("%x ", dec_out[i]);
}
printf("\n");*/
return 0;
}
DÜZENLEME: Ben sonuçlar elde ettim yerine AES_BLOCK_SIZE
ait inputslength
için çıkışları boyutları değişti
:
Give a key length [only 128 or 192 or 256!]:
128
Give an input's length:
5
original: 30 30 30 30 30
encrypted: 94 56 50 7E 19 B2 1C CE 20 23 4A E7 10 AF DB E3 30 30 30 30 30
decrypted: E1 5F F4 3D E8 8D 91 19 CD 3E 22 1E AF 1C 8F 5A 94 56 50 7E 19 B2 1C CE 20 23 4A E7 10 AF DB E3 30 30 30 30 30
yüzden mümkün olduğunu outpus ile gidecekseniz bir sorun boyutları ve iv boyutu? Ne boyutları olmalıdır (AES-CBC-128, AES-CBC-192, AES-CBC-256 için)?
Sidenote: AES anahtarınızın boş bırakılmasına gerek yoktur. onun rasgele bir bayt bloğu; bu kadar. Bu konuda null-term hiç bir şey yok, yani aes_key [keylength-1] = '\ 0' 'anlamsızdır (her zaman anahtarınızın son baytını (olması gerekenden 8x daha büyük olan) sıfır olarak ayarlar. – WhozCraig
@WhozCraig: teşekkürler, bunu bilmek güzel. Asıl sorun ne dersin, herhangi bir fikrin var mı? – ivy
Plenty. Şifreleme ve şifre çözme için tampon boyutları hiçbir yerde * yeterince * yeterince büyük. ve bu şeyleri karakter verileri olarak ele almaya çalışmak yerine, genel bir hex yazdırma işlevine ihtiyacınız var. * Bu ikili *. Şimdi resmi bir cevap oluşturmak, ama oraya bakmaya başlamak. – WhozCraig