2008-10-13 2 views
2

Ruby 클라이언트와 Python 서버간에 암호화 된 데이터를 전송할 수 있어야하며 그 반대의 경우도 ruby-aes gem/라이브러리에 문제가 있습니다. 라이브러리는 사용하기가 쉽지만 Python 용 pyCrypto AES 라이브러리와 데이터를주고받는 데 문제가있었습니다. 이 라이브러리는 사용되는 유일한 라이브러리이지만 언어 경계에서 잘 작동하지 않는 것 같습니다. 어떤 아이디어?Ruby/Python에서 사용할 AES 라이브러리는 무엇입니까?

편집 : 우리는 SOAP를 통한 통신을 수행하고 있으며 이진 데이터를 base64로 변환하여 사용하지 않으려 고 시도했습니다. 또한 암호화/복호화가 거의 비슷하지만 (예 : 길이가 하나씩 다르거 나 해독 된 문자열 끝에 여분의 가비지 문자가 있음)

+0

질문 제목은 사용할 라이브러리를 중심으로 한 답변이 없기 때문에 약간의 오해의 소지가 있습니다. 이 방법이 더 좋습니다 : http://stackoverflow.com/questions/172486/what-pure-python-library-to-use-for-aes-256-encryption – wsorenson

답변

3

루비 에이스는 자동으로 데이터를 채워 16 개의 문자를 채우고 마지막 문자의 끝 부분에 null 문자를 구분 기호로 사용합니다. PyCrypto는 16 문자의 배수가 필요하므로 루비 에일이 무엇을하는지 파악했습니다.

1

종류에 따라 다릅니다. 당신은 암호화 된 데이터를 전송하고 있습니다. 한 언어로 파일을 작성한 다음 다른 언어에서 파일을 읽는 중 일 수 있습니다. Python (특히 Windows)에서는 바이너리 파일에 바이너리 모드를 지정해야합니다. 당신이 암호를 해독하려는 가정, 파이썬 그래서,이 같은 파일을 열어야합니다 :

f = open('/path/to/file', 'rb') 

은 "B"가 진을 나타냅니다. 당신은 암호화 된 데이터를 작성하는 경우 그리고 파이썬에서 파일로 :

f = open('/path/to/file', 'wb') 
f.write(encrypted_data) 
+0

감사합니다.이 경우 SOAP 서버를 통해 처리합니다. . 나는 거기에 비슷한 아날로그 있지만 이진 파일 대신 SOAP 생각하고있어. –

+0

암호화 된 (바이너리) 데이터는 SOAP 패킷에 어떻게 캡슐화됩니까? 나에게 SOAP 문제처럼 들린다. 아마도 당신은 질문에 더 많은 세부 사항을 추가해야합니다. – mhawke

+0

Ruby와 Python 사이의 언어 및/또는 암호화 라이브러리 문제를 제거 할 수 있습니다. 한 언어에서 이진 파일에 쓰고 다른 언어로 해독하려고 시도하면됩니다. 그런 다음 전송 계층을 살펴 봅니다. – mhawke

2

그것은 심지어 어떤 더 많은 정보없이 무슨 일이 일어나고 추측하기 어렵다 ... 내가 당신이라면

, 나는에서 그것을 확인할 것 당신의 파이썬 및 루비 프로그램 :

  1. 키는 동일합니다 (분명히). 16 진수로 덤프하고 각 바이트를 비교하십시오.
  2. 초기화 벡터는 동일합니다. pyCrypto에서 의 AES.new()에있는 매개 변수입니다. 그들을 16 진수로 덤프하십시오.
  3. 모드는 동일합니다. 매개 변수 mode은 pyCrypto에서 AES.new()입니다.

이 pyCrypto에서 IVmode에 대한 기본값입니다,하지만 그들은 루비 구현과 동일 신뢰하지 않습니다. CBC와 같은 간단한 모드 중 하나를 사용하십시오. 다른 라이브러리에는 PTR과 같은 모드 복합 모드가 어떻게 작동하는지에 대한 다른 해석이 있다는 것을 알았습니다.

위키 백과에는 block cipher modes에 대한 훌륭한 글이 있습니다.

+0

예, 키, IV 및 모드가 모두 동일합니다. 결국 내 대답을보고 문제가 끝났는지 확인하십시오. –

1

기본적으로 Hugh는 위에서 말한 것입니다. 모든 것이 동일한 지 확인하기 위해 IV, 키 크기 및 연결 모드를 확인하십시오.

양측을 독립적으로 테스트하고 정보를 인코딩 한 다음 Ruby와 Python이 동일하게 정보를 인코딩했는지 확인하십시오. 문제는 암호화와 관련이 있다고 가정하고 있지만 암호화 된 데이터를 임의의 개행을 데이터에 던지는 puts으로 보내는 것만 큼 간단 할 수도 있습니다. 데이터를 올바르게 암호화했다는 확신이 들었을 때 보낸 사람과 정확하게 일치하는지 확인하십시오. 데이터를 손상시키는 단계를 찾을 때까지 단계별로 계속 진행하십시오.

또한 외부 보석을 사용하는 대신 루비의 표준 라이브러리에 포함 된 openssl 라이브러리를 사용하는 것이 좋습니다.

5

(예를 들어, 길이는 하나의 차이 또는 해독 된 문자열의 끝에 추가 가비지 문자가) 내가 그 비트를 놓친

은. 암호화/암호 해독에 아무 문제가 없습니다. 패딩 문제 같은데. AES는 항상 128 비트 블록으로 데이터를 인코딩합니다. 데이터의 길이가 128 비트의 배수가 아니면 암호화 전에 데이터를 채워야하며 암호화 후에는 패딩을 제거/무시해야합니다.

+0

그래, 그게 본질적으로 그게 밝혀졌습니다. –

관련 문제