2016-08-09 1 views
0

pycrypto를 사용하여 Python에서 일부 JS (SJCL 라이브러리를 사용)를 다시 작성하려고합니다. 나는 내 문제는 암호가 아니라 방법은 라이브러리가 fromBits 변환을 처리하는 다음 코드Python에서 SJCL .frombits 구현

aes = new sjcl.cipher.aes(this.key); 
bits = sjcl.codec.utf8String.toBits(text); 
cipher = sjcl.mode.ccm.encrypt(aes, bits, iv); 
cipherIV = sjcl.bitArray.concat(iv, cipher); 
return sjcl.codec.base64.fromBits(cipherIV); 

을 구현하는 방법을 알아내는 데 문제가 있어요. SJCL의 문서에 따르면

우리의 암호 프리미티브의 대부분은 내부적으로 4 바이트 단어의 배열에서 작동하지만, 그들 중 많은 사람들이 4 바이트의 배수가 아닌 인수를 취할 수 있습니다. 이 라이브러리는 32 비트 워드의 배열로 비트 배열 (8 비트의 배수 일 필요는 없음)을 인코딩합니다. 비트는 빅 엔디 언으로 한 번에 32 비트 씩 단어 배열로 압축됩니다. 단어는 배정 밀도 부동 소수점 숫자이므로 몇 가지 추가 데이터에 적합합니다. 우리는 이것을 (개인적으로, 아마도 변화하는 방식으로) 사용하여 배열의 마지막 단어에 실제로 존재하는 비트의 수를 인코딩합니다.

이 비트 배열에 그 변환을 암시하는 것 같다 나에게

내가 CONCAT 작업 중 보급 될 것입니다 걱정 추가 정보는 어떤 종류의에 추가합니다. 또한, concat 후에 결과는 base64 문자열로 반환됩니다. 나는 이것을 복제하기위한 적절한 'struct'패킹 매개 변수를 확신하지 못합니다.

답변

1

이 코드를주의 깊게 보면 자체 포함되어 있습니다. 이 코드를 실행 한 후에는 SJCL의 "비트"(원시 이진 데이터 표현)가 필요하지 않습니다. 이 내부 데이터는 암호화 및 연결 함수에 제공되고 그 결과는 "정상적인"Base64로 인코딩 된 문자열로 다시 변환됩니다.

이 코드에 유일한 문제는 this.keyìv의 인코딩입니다.

PyCrypto는 이미 파이썬 언어가 이진 문자열 또는 bytes (파이썬 버전에 따라 다름)을 제공하기 때문에 특별한 내부 바이너리 데이터 인코딩을 가지고 있지 않습니다. 하지만 여전히 Base64 인코딩을 사용하여 string에서 인코딩/디코딩해야합니다.

관련 문제