2017-03-07 4 views
2

자바에서 AES 암호화 된 바이트를 해독해야합니다. 소스 데이터는 성공적인 해독의 표시로 2 개의 알려진 검증 바이트로 시작합니다. 데이터의 길이는 일부 프로토콜의 이유로 255 바이트보다 작으며, 데이터가 이미 암호화 된 사람이 필요하면 패딩으로 사용 된 것과 동일한 검증 바이트를 사용하여 데이터가 패딩 된 것으로 간주됩니다. 필자는 사용 가능한 접근법으로 수십만 개의 레코드를 성공적으로 해독했습니다.AES 해독의 유효한 결과가 1 바이트와 1 바이트 만 다를 가능성은 얼마나 높습니까?

성공적인 해독 (?) 후 해독 한 결과가 예상 한대로 단 하나의 ONEYYY 바이트 만 다른 레코드가 생겼습니다. 물론 그것은 확인 바이트가 아니라 ;-), 아주 특별한, 문서화 된 의미를 가진 다른 1 바이트. 항상 동일하고 일정한 잘못된 값을 가진 항상 동일한 바이트입니다. 간단히 말해서 0x47을 얻으십시오. 제조업체 특정 설명서에 따라 0x44을 가져야합니다.

간단히 말해서, 그 밖의 모든 결과는 내가 가지고 있고 의미있는 문서에 따라 정확합니다. 문제는 지금 내가 정확한 데이터를 가지고 나의 0x47 대신에 0x44을 얻는다는 주장을하는 데이터의 제조자이다. 내가 AES/CBC/NoPadding으로 내 응용 프로그램의 디버거에서 Cipher를 사용하는 암호 해독을 위해 우리가 의견 ...

서로 다른 나는 이미 내 결과 데이터에 잘못된 0x47Cipher.final에 대한 호출 후 것을 볼 수 있습니다. 나는 내 방식의 오류를 찾을 수 없기 때문에, 나는 다른 AES의 decrypters을 테스트하기로 결정 발견 나는 동일한 입력 데이터가 동일한 결과를 주장하는 3 가지 구현 :

다른 AES 해독기가 있지만 대부분 초기화 벡터를 지원하지 않으므로 c를 제공하지 않습니다. 옳은 결과. 그리고 그것은 모든 요점입니다. 입력이 다르면 출력이 달라지며, 테스트 결과에 따라 차이가 커집니다. 몇 바이트 만 변경되거나 결코 변하지 않을 것입니다. 이는 제가보기에는 1 바이트를 제외하고는 항상 완전히 잘못되었거나 완전히 정확합니다.

따라서 올바른 AES가 구현되면 동일한 AES 암호 해독 작업에 대해 동일한 입력을 통해 서로 다른 결과가 생성 될 수 있습니까? 나는 그렇게 생각하지 않는다.

잘못된 입력이 1 바이트를 제외하고 올바른 결과를 생성하는 가능성은 얼마나됩니까? 광산이나 다른 입력 중 하나가 잘못 되었기 때문에 복사해도 아무런 차이가 없습니다.

잘못된 AES 구현이 거의 정확한 결과를 산출 할 가능성이 얼마나 높습니까? 자바는 잘못된 AES 구현을 전혀 제공하지 않을 가능성이 얼마나 높습니까? 나는 그렇게 생각하지 않는다.

더 이상 테스트 할 수있는 정보가 있습니까? 내게는 3 가지 추가 구현이 모두 내 결과를 증명할 수있는 것처럼 보입니다. 그래서 내가하고있는 일이 정확하고 특정 특수 바이트의 차이가 어떤 이유로 든 다른 곳에서 올 필요가 있다고 생각합니다.

감사합니다.

답변

0

이 경우 올바르지 않은 바이트가 첫 번째 블록에 있고 잘못된 IV로 인해 발생합니다.

응답 코멘트에 확장 :

IV가 첫 번째 데이터 블록을 XOR 연산하고, CBC mode decryption 참조. 암호화에서 IV의 단일 바이트 (또는 비트) 변경은 모든 바이트에 영향을 미치지 만 암호 해독시 잘못된 IV (또는 비트) IV에 해당하는 첫 번째 블록의 바이트 (비트)에만 영향을 미칩니다.

또 다른 일반적인 접근법은 다른 채널/방법을 통해 IV를 공유하지 않아도되는 IV를 암호화 된 데이터 앞에 추가하는 것입니다.

이것은 검증 방법이 좋지 않음을 지적합니다. 더 좋은 계획은 모든 암호화 된 바이트, 일반적으로 암호화 된 데이터의 HMAC를 고려합니다. 그러나 계산 상 제한된 환경에서는 CRC 또는 체크섬으로도 충분할 수 있습니다.

1

잘못된 입력이 1 바이트를 제외하고 올바른 결과를 생성하는 가능성은 얼마나됩니까?

잘못된 입력에 따라 다를 수 있습니다. 차이점을 발견했습니다. 차이점은 init 벡터에서 하나 뿐이며 그 차이는 실제 결과에서 한 바이트 만 차이가납니다.

init 벡터의 차이점은 init 벡터를 올바르게 빌드하는 방법을 정의하는 기본 스펙을 이해하는 데 있습니다. 데이터는 버전 번호를 데이터에 포함해야하는 일부 장치에서 가져온 것이고 사양은 두 버전의 다른 위치에 동시에 버전을 포함 할 수 있습니다. 현재 문제가되는 레코드는 두 개의 다른 위치에서 사용할 수 있지만 두 가지 다른 값도 있습니다. 그래서 상대방이 두 번째 자리에서 버전 번호를 사용하고 두 값이 다르기 때문에 처음부터 버전 번호를 사용합니다. 다른 init 벡터와 다른 결과를 얻습니다.

WTF ?! :-)

+1

IV에 첫 번째 데이터 블록이 포함되어 있으며 [CBC 모드 암호 해독] (https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Cipher_Block_Chaining_.28CBC.29)을 참조하십시오. 암호화 모드를 지정하지 않으면 CBC 모드라고 가정합니다. 암호화시 단일 바이트가 모든 바이트에 영향을 미치지 만 해독시 IV에서 올바르지 않은 바이트에만 영향을 미칩니다. – zaph

0

CBC 모드에서는 각 암호문 블록이 키를 사용하여 암호 해독되고 그 결과는 일반 텍스트를 복구하기 위해 암호문의 이전 블록과 XOR됩니다.

이것은 간단한 XOR 연산이므로 이전 암호문의 비트를 뒤집기하면 현재 일반 텍스트 블록의 해당 비트가 뒤집어집니다. 물론 뒤집힌 비트를 사용하여 데이터를 해독하면 이전 일반 텍스트 블록도 완전히 손상됩니다.

첫 번째 블록을 해독 할 때 "이전"암호 텍스트 블록이 없습니다. 그것이 초기화 벡터가 들어오는 곳입니다. 이것은 암호 텍스트의 0 블록으로 동작하며, 위에서 설명한대로 IV를 변경하면 첫 번째 일반 텍스트 블록에서 비트 단위로 변경됩니다.