이 내 앞의 질문 (RSA Decryption)의 연속이다256bit 키를 가진 aes128 암호를 호출 할 때 libgcrypt가 다른 것은 무엇입니까? .
편집 :.. 아래의 대답은 간단 명료했다 나는 아래의 몇 가지 예제 코드는 제가 그럴 게요 무슨 일이 일어나고 무슨 생각을 확인 도왔다 추가 한 오늘 테스트하고 다시 게시하십시오. 클라이언트 응용 프로그램에서 256 비트 키를 만들지 만 gcry_cipher_setkey를 호출하면 알고리즘에서 반환 된 키 길이가 사용됩니다. 따라서 setkey가 256 비트 키를 128 비트로 잘라 버릴 것입니다. 테스트하기에 충분히 쉽습니다.
aes128/cbc/no padding을 사용하여 libgcrypt를 사용하여 암호화 된 파일의 암호를 해독하려고합니다. 암호화를 수행하는 두 가지 응용 프로그램이 있습니다. 둘 다 내가 통제 할 수 없다. 하나는 128 비트 AES 키를 사용하고 다른 하나는 256 비트 키를 사용합니다. 그렇지 않으면 모든 내부 호출이 동일합니다.
편집는 : 나는 해독 시작하기 전에 내가 전에 이렇게 내 C# 코드에 따라서
#define AES_KEY_SIZE 32
char AESKey[AES_KEY_SIZE+1];
GenerateAESKey(AESKey);
Error = gcry_cipher_open(AesHandle, GCRY_CIPHER_AES128, GCRY_CIPHER_MODE_CBC, 0);
// this is always 128bits (16 bytes)
BlockLength = gcry_cipher_get_algo_blklen(GCRY_CIPHER_AES128);
// this should return 128bits (16 bytes)
KeyLength = gcry_cipher_get_algo_keylen(GCRY_CIPHER_AES128);
Error = gcry_cipher_setiv(AesHandle, NULL, 0);
// AESKey is a 32byte (256bit) char array & KeyLength is 128bits (16bytes)
// so gcry_cipher_setkey only uses the first 'KeLength' bytes of 'AESKey'
// which in this case is the first 16 bytes of 'AESKey'
Error = gcry_cipher_setkey(*AesHandle, AESKey, KeyLength);
Error = gcry_cipher_encrypt(AesHandle, Encrypted, BlockLength, ToEncrypt, BlockLenth);
void GenerateAESKey(char * AESKey) {
int i;
srand(time(NULL));
for (i = 0; i < AES_KEY_SIZE; i++) {
AESKey[i] = (rand() % 93)+33;
}
AESKey[AES_KEY_SIZE] = '\0';
}
: 편집 2 : 미래의 사용자를위한 고정 된 순서 & 추가 코멘트를 여기에 의사 암호화 코드
var aesKey = DecryptAesKey(s);
if (aesKey.Length == 32)
{
var tempKey = new byte[16];
Buffer.BlockCopy(aesKey,0,tempKey,0,16);
aesKey = tempKey;
}
나는 파일을 해독하기 위해 C# & bouncycastle을 사용하고 있습니다. 성공적으로 128 비트 키를 사용하여 암호화 된 파일의 암호를 해독합니다. 하지만 키가 256 비트 일 때 실패합니다. Fail은 출력이 왜곡되어 있음을 의미합니다.
AES 키가 두 소스에서 모두 올바르게 해독되었음을 확인했습니다.
제 질문은 키가 256 비트인데 Libgrypt가 다른 점은 무엇입니까? 아니면 내 암호 해독이 실패한 이유를 알아내는 올바른 경로입니까? 당신이 날 지점 수있는 정보 또는 방향을 주셔서 감사합니다.
에게 브라이언
원래 질문을 수정했습니다. – TheBrian
답변 해 주셔서 감사합니다. 'gcry_error_t gcry_cipher_setkey (gcry_cipher_hd_t h, const void * k, size_t l)'은 l = 16이고 k는 32 바이트 어레이였습니다. 따라서 setkey는 'k'의 첫 번째 'l'바이트 만 사용합니다. 위대한 성공으로 해독하는 32 바이트 키의 처음 16 바이트 만 사용하여 내 C# 코드에서 확인했습니다. 다시 감사합니다! – TheBrian