crypto ++ RSA 및 "유효하지 않은 암호 텍스트"
-
13-09-2019 - |
문제
글쎄, 나는 요즘 내 개인 지옥을 겪어 왔어
RSA를 사용하여 암호화 된 메시지를 해독하는 데 어려움을 겪고 있으며 항상 "RSA/OAEP-MGF1 (SHA-1) : 유효하지 않은 CIPHERTEXT"로 실패합니다.
Base64에 인코딩 된 개인 키가 있으며로드합니다.
RSA::PrivateKey private_key; StringSource file_pk(PK,true,new Base64Decoder); private_key.Load( file_pk );
그런 다음 다음을 수행하여 메시지를 해독합니다.
RSAES_OAEP_SHA_Decryptor decryptor(private_key); AutoSeededRandomPool rng; string result; StringSource(ciphertext, true, new PK_DecryptorFilter(rng, decryptor, new StringSink(result) ) );
내가 알 수있는 한, 메시지는 아무런 문제없이 구문 분석되어야합니다. ciphertext는 std :: string이므로 끝에 예상치 못한 일을 할 수 있습니다.
나는 단지 무언가를했지만 개인 키가 잘못되었지만 BER 디코드 오류를 던지지 않고 어쨌든로드 할 수 있다면 어떻게해야합니까? 해독 할 때 그 날은 무엇을 던질까요?
누구나 이것에 대해 약간의 빛을 발할 수 있기를 바랍니다.
건배
해결책
키가 실제로 손상된 경우로드 기능이 실패했을 것입니다. 그러나 열쇠를 스스로 테스트하도록 요청할 수 있습니다. Validate
, 처럼:
bool key_ok = private_key.Validate(rng, 3);
두 번째 매개 변수 (여기, 3)는 수행 할 수있는 양을 지정합니다. RSA의 경우 이렇게하면 사용 가능한 모든 테스트, 느리게/비싼 테스트도 실행됩니다.
디코딩이 실패 할 수있는 또 다른 이유는 키가 단순히 원래 메시지를 암호화하는 데 사용 된 것이 아니기 때문입니다.
분명히 암호 텍스트 입력은 원래 암호화 측면에서 생성 된 것과 완전히 동일해야합니다. 디버깅의 경우,이를 확인하는 한 가지 좋은 방법은 양쪽의 암호 텍스트를 양쪽의 해시 기능 (물론 편리하게 사용할 수 있음)으로 공급하고 출력을 비교하는 것입니다. 육각 또는 Base64가 암호 텍스트를 인코딩 한 경우 전송을 위해 취소해야합니다.