2012-02-27 6 views
2

대칭 암호화를 위해 CNG의 AES 주변에 AES-OFB 래퍼를 구현하려고합니다.Microsoft CNG BCryptEncrypt 반환하는 암호문 == ​​plaintext

내가 이해할 수없는 문제가 발생했습니다 ... AES 알고리즘 핸들 (BCRYPT_AES_ALGORITHM)을 만들고 AES 키를 가져 왔습니다. 다음 내 평문/암호문을 XORing과 함께 사용하기 위해 16 바이트 키 스트림을 생성하려고 시도합니다. 이 메커니즘을 처음 실행하면 keyStreamPtr이 임의의 바이트 스트림에서 다른 바이트 스트림으로 변경되지만 세 번째로는 (키 스트림의 16 바이트 세 번째 세트) 동일한 출력을 얻기 시작하고 영원히 발생합니다.

  status = BCryptEncrypt((BCRYPT_KEY_HANDLE)keyHandle, 
            keyStreamPtr, 
            keyStreamLength, 
            NULL, //no padding 
            NULL, // no IV 
            0, // no IV 
            keyStreamPtr, 
            keyStreamLength, 
            &Length, 
            0); // no option flags 

아무도 이런 식으로 본 사람이 있습니까? AES가 왜 입력 된 일반 텍스트와 완전히 동일한 암호문을 반환하겠습니까? 다시 이것은 AES-OFB 구현을위한 것입니다 ... 아마도 나는 잘못된 것을하고 있습니까?

답변

0

제가 생각할 수있는 유일한 점은 키 스트림을 다시 암호화한다는 것입니다. 이렇게하면 효과적으로 암호화/해독을 수행합니다 : P XOR C XOR C = P 여기서 C는 키 스트림이고 P는 일반 텍스트입니다. 코드 내의 버퍼/스트림 처리를 살펴볼 수 있습니다.