2013-07-17 4 views
0

이 내 앞의 질문 (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가 다른 점은 무엇입니까? 아니면 내 암호 해독이 실패한 이유를 알아내는 올바른 경로입니까? 당신이 날 지점 수있는 정보 또는 방향을 주셔서 감사합니다.

에게 브라이언

답변

2

을 당신이

  1. 이 다른 키 (128 및 256 비트) 암호문의
  2. 이 다른 소스가 있다고 가정 (1 : AES128 2 : AES256 모두 : CBC/No Padding)
  3. 128 암호문
  4. 실패 위스콘신의 암호를 해독 할 수 th 256 (모든 것이 왜곡되고 평문에서 아무 것도 해독되지 않습니다).

주요 차이점은 128 또는 256 비트의키 길이이다. 입력을 변환하는 변환 라운드의 반복 횟수를 지정합니다. 내부 구현 세부 사항은 절대로 필요하지 않습니다. AES는 더 큰 키가있는 라운드를 더 많이 사용합니다. 128 비트 키는 10, 256 비트 키는 14입니다.

중요 부분은 입니다. 블록 크기는 128 및 256 CBC AES의 경우 항상 128 비트입니다.

모두 AES-CBC-128와 AES-CBC-256을 사용128 비트 IV.

그래서 내 야생 추측은 (AES256 코드를 보지 않고) AES256 코드의 Block 또는 IV 크기에 어딘가에 버그가있을 수 있다는 것입니다. 그냥이 기능을 128AES에 대한 키를 설정하면

이 설정 알고리즘의 필요한 길이와 일치해야합니다 키 K (바이트)이 docs

gcry_error_t gcry_cipher_setkey (gcry_cipher_hd_t h, const void *k, size_t l) 

길이 (L)를 확인 가변 키 크기를 갖는 알고리즘의 경우 허용 범위는 입니다. 함수 은이 점을 검사하고 문제가 있으면 오류를 반환합니다. 발신자 은 항상 오류를 확인해야합니다.

그리고 당신은 일반적으로하지만, 패딩 문제 (데이터 크기는 16 바이트의 배수가 항상 제외) NoPadding와 CBC를 사용하지 않으려는 일반 텍스트의 마지막 16 바이트 블록을 V 곡.

+0

원래 질문을 수정했습니다. – TheBrian

+1

답변 해 주셔서 감사합니다. '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