2012-06-29 4 views
0

내 서버가 파이썬으로 코딩되어 있으며이 서버에 대한 Java 클라이언트를 만들고 있습니다. 지금은 Base64.encodeBase64를 사용하여이 서명을 인코딩 때문에 형성된 BYTEARRAY (이름 my_byte_array)을 변환하고, 이것은 BYTEARRAY (이름 signed_data)를 반환Java Python 메시지 서명 및 확인

public static byte[] Sign(PrivateKey privateKey, byte[] data) throws Exception{ 
     System.out.println("Signing the key inside RSACrypto#Sign"); 
     Signature dsa = Signature.getInstance("SHA1withRSA"); 

     SecureRandom secureRandom =null; 
     dsa.initSign(privateKey,secureRandom); 
     dsa.update(data); 
     return dsa.sign(); 
} 

:

내가 사용하여 메시지 (데이터)에 서명하고

String str = new String(my_byte_array) 

문자열을 서버로 보내는 것.

서버 측에

, 나는이 문자열을 수신 한 다음 서버를 사용하여 서명을 확인 : 나는 그들이 동일 양쪽에 my_byte_array 인쇄하려고, 그래서 때 라이브러리 http://gdata-python-client.googlecode.com/hg/pydocs/gdata.Crypto.PublicKey.RSA.html

를 사용

publicKey.verify(str(data), (long(base64.b64decode(my_byte_array)),)) 

signed_data 및 base64.b64decode (my_byte_array)

그러나 나는이 오류가 무엇입니까 :

ValueError: invalid literal for long() with base 10: '\x8b\xa1\xbb\x19fO\xea\xe7\xa4B\xd4\xd2\xa1\xe3\xb9\xd0\x89n\xa2\xfe\xb5\xedsL\x02\xba\xad\x12!qjp\x0c%+Z\t\xa7\x12\x08\x90\xfaTk\xca\xd0\xae\xd8\xa9\xfa\xbb]>9\x1c\x80\xd0 
,536을

자바가 메시지를 바이트로 서명하고 파이썬이 메시지를 Long에 넣기를 기대하기 때문에이 오류가 발생합니다.

이 문제를 해결할 방법이 있습니까?

답변

1

실제로 문제가 2 개 있습니다.

Java Cryptograpy Architecture API에 따르면 - SHA1withRSA 알고리즘은 PKCS # 1 v1.5 패딩을 포함합니다. Python 측에서는 서명을 확인하기 위해 동일한 패딩 체계를 사용해야합니다. 이는 PyCrypto의 PKCS # 1 v1.5 서명 모듈 (Crypto.Signature.PKCS1_v1_5)을 통해 얻을 수 있습니다.

두 번째 문제점은 지적한 것입니다. RSA PyCrypto 객체의 메소드 이상한 것은 서명을 정수로 인코딩해야한다는 것입니다. 그러나 위에서 언급 한 모듈을 사용하면 바이트 문자열을 받아들이므로 문제가 해결됩니다.

+0

Java 및 Python 측 모두에서 NoPadding을 사용하여이를 수행 할 수있는 방법이 있습니까? – d34th4ck3r

+0

@ d34th4ck3r 방법이 있지만 패딩은 RSA 서명을 안전하게 만드는 요소이므로 항상 사용해야합니다. – SquareRootOfTwentyThree

+0

고마워요.하지만 당신의 방법을 시도 할 때, 검증은 항상 거짓으로 이어집니다. (여기에 내 코드가 있습니다 : https://gist.github.com/3036062 – d34th4ck3r