2011-08-10 3 views
0

.NET에 변환하려고하는 java에 샘플 코드가 있습니다. 이 코드는 문자열을 암호화하고 서명을 추가합니다. BouncyCastle 공급자를 사용하는 Java 코드와 서명을 추가하는 코드가 다음과 같습니다.다른 서명을 생성하는 .NET 및 Java

InputStream in = new FileInputStream(derkeyfilename); 
byte[] privKeyBytes = new byte[in.available()]; 
in.read(privKeyBytes); 
KeyFactory rsaKeyFac = KeyFactory.getInstance("RSA"); 
PKCS8EncodedKeySpec encodedKeySpec = new PKCS8EncodedKeySpec(privKeyBytes); 
private RSAPrivateKey myPrivateKey = (RSAPrivateKey) rsaKeyFac.generatePrivate(encodedKeySpec); 

MessageDigest md = MessageDigest.getInstance("MD5", "BC"); 
byte[] digest = md.digest(msg); 
Signature sig = Signature.getInstance("MD5withRSA", "BC"); 
sig.initSign(myPrivateKey); 
sig.update(digest); 
byte[] signature = sig.sign(); 
byte[] base64 = Base64.encodeBase64(signature); 
String signature = new String(base64); 

누구든지 나를 C#으로 변환하는 데 도움을 줄 수 있습니까? 내가 몇 가지 샘플 (C#, openssl 등 BouncyCastle) 시도하고 모두 자바가 생산하는 것과 다른 동일한 서명을 반환하고 있습니다. 내가 찾은 한 가지 더 자바 사용합니다. 개인 키를 C#에서 지원되지 않습니다 (내가 아는 한). 동일한 인증서에 .pem 키를 사용하고 있습니다. 당신이 당신의 C#을 점을 표시하지 않기 때문에

+2

'InputStream'에서 읽는 방법이 깨져서 시작됩니다. 개인적으로 나는'available()'을 신뢰하지 않으며 스트림에서 읽지 말고'read'의 리턴 값을 무시해서는 안됩니다. 다이제스트 자체가 같은지 확인 했습니까? 문자열에서 시작하는 바이트는 어떻게 받고 있습니까? 짧지 만 완전한 * 예제는 C#에서 시도한 것을 포함하여 실제로 도움이됩니다. 여러 .NET 접근 방식이 동일한 서명을 제공하는 경우 올바른 것일 수도 있습니다 ... –

+0

또한 MD5 다이제스트로 '서명'을 제공하는 경우에만 ... 입력을 제공하지 않아야합니다 데이터 ('msg')? –

+0

@Jon 다이제스트는 완전한 데이터가 아닌 항상 서명됩니다. –

답변

2

, 난 단지 당신의 문제가 무엇인지 추측 할 수 있습니다

자바에서, 당신은 이중 MD5 해시를하고 있습니다. 명시 적으로 코드에 명시 적으로 한 번 암시 적으로 Signature 객체 (MD5WithRSA으로 정의 됨)를 참조하십시오. 따라서 당신은 여기가

signatureJava = RSA(MD5(MD5(msg))) 

당신은 C#을 측면에 명시 적으로이 첫 번째 MD5를하지 않는 경우가 있습니다

분명히
signatureC# = RSA(MD5(msg)) 

당신이 fixpoint에 충돌하지 않는 한이이 동일하지 않습니다 귀하의 메시지와 MD5의 (매우 가능성).

이 외에도 C# 서명이 항상 동일한 지 확인하십시오. 알다시피, RSA 서명은 (in the modes normally used) 임의의 패딩 데이터를 통합하기 때문에 결정적이지 않습니다.

+0

+1 불행히도 PSS는 Java의 일반 모드가 아니며 PKCS # 1.5 패딩을 사용하는 RSA입니다. – emboss

관련 문제