2011-10-12 6 views
0

다음 코드를 C#에서 Java로 변환하려고하지만 키의 결과 값이 달라집니다. 여기 내 코드는 다음과 같습니다C# Java로 이식 된 암호화 코드

C 번호 :

 plainText = "Hello World"; 
     passPhrase = "IhDyHz6bgQyS0Ff1/1s="; 
     saltValue = "0A0Qvv09OXd3GsYHVrA="; 
     hashAlgorithm = "SHA1"; 
     passwordIterations = 3; 
     initVector = "GjrlRZ6INgNckBqv"; 
     keySize = 256; 

     byte[] initVectorBytes = Encoding.ASCII.GetBytes(initVector); 
     byte[] saltValueBytes = Encoding.ASCII.GetBytes(saltValue); 

     byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText); 

     PasswordDeriveBytes password = new PasswordDeriveBytes(
                 passPhrase, 
                 saltValueBytes, 
                 hashAlgorithm, 
                 passwordIterations); 

     byte[] keyBytes = password.GetBytes(keySize/8); 

자바

 byte[] password = PassPhrase.getBytes("ASCII"); 
     byte[] salt = PKCS5S1ParametersGenerator.PKCS5PasswordToBytes(SaltValue.toCharArray()); 

     PKCS5S1ParametersGenerator generator = new PasswordDeriveBytes(new SHA1Digest()); 
     generator.init(password, salt, PasswordIterations); 

     byte[] key = ((KeyParameter)generator.generateDerivedParameters(32)).getKey(); 

문제는 심지어 두 코드에서 제공하는 동일한 매개 변수와 함께 다른 키를 얻을 수 있습니다 : (전용 처음 4 바이트 일치)

참고 :이 값은 Base64로 변환했다 :

C 번호 : GWR/loJAuuiPvP0cuGGCVXErz16HjOZ7yQkCCHfBux4 = 자바 : GWR/4oCT

내가 generateDerivedParameters로 (32)를 제공 한 번호로 계속 연주하면

, 그것을 단지 더 많은 바이트를 제공하지만 여전히 .Net에서의 결과와 일치하지 않습니다.

.Net 코드를 변경할 수 없으므로 Java 측에서 제안을 해주시기 바랍니다.

미리 감사드립니다.

답변

1

generateDerivedParameters 메서드는 "keySize 원하는 키의 크기 (비트 단위)"라고 말합니다. 그래서 당신이 명확한 설명 generateDerivedParameters(32 * 8)

+0

감사를 사용해야 만, 여전히 C 번호 키를 일치하지 않는,이 결과 : GWR/4oCT4oCaQMK6w6jvv73CvMO9HMK4YeKAmlVxK8OPXuKAocWSw6Z7w4kJAgh3w4HCux4 = – lidermin

+0

다른 표준 것 같은데 (원문!) Base64로 다른 알파벳을 사용하는의. 바이너리 값을 바이트와 비교하여 동일성을 확인할 수 있습니까? – kan

+0

OMG 당신이 C#에서 simil에 비해 많은 Base64 Java 메소드 변환을 테스트 했음에도 불구하고 완전히 바르게되었습니다. 이번에는 바이트를 보면 어리석은데, 실제로는 동일합니다. – lidermin