Android에서 암호화에 문제가 있습니다. 테스트를 위해 RSA와 SHA를 사용하여 서명을 생성하는 프로그램을 만들었습니다.Java PrivateKey가 Android와 다릅니다
public static byte[] generateKey(String privKeyModulus, String privKeyD, String encryptCredentials) throws NoSuchAlgorithmException, InvalidKeySpecException, InvalidKeyException, UnsupportedEncodingException, SignatureException {
byte[] modulusBytes = Base64.getDecoder().decode(privKeyModulus.getBytes());
byte[] dBytes = Base64.getDecoder().decode(privKeyD.getBytes());
BigInteger modulusInt = new BigInteger(1, modulusBytes);
BigInteger dInt = new BigInteger(1, dBytes);
RSAPrivateKeySpec rsaPrivKey = new RSAPrivateKeySpec(modulusInt, dInt);
KeyFactory factory = KeyFactory.getInstance("RSA");
PrivateKey privKey = factory.generatePrivate(rsaPrivKey);
// Here is the problem:
System.out.println(Arrays.toString(privKey.getEncoded()));
Signature sig = Signature.getInstance("SHA1withRSA");
sig.initSign(privKey);
sig.update((encryptCredentials).getBytes("UTF-16LE"));
byte[] signature = sig.sign();
return signature;
}
이제 Java와 Android에서 PrivateKey와 다른 값을 얻게되었습니다. 그 방법은 두 프로그램 모두에서 정확히 동일하기 때문에 혼란 스럽습니다. Java와 Android에서 모두 작동해야하는 java.security입니다. 다른 모든 값 (예 : byte [] 등)도 확인했지만 모두 동일합니다.
어떤 도움이 필요합니까? PKCS # 8과 Base64로 같은
글쎄, java.security는 보안 공급자와의 인터페이스로, Oracle Java 및 Android의 "SunJCE"는 자체 구현이며 "AndroidOpenSSL"이 기본값입니다. – divanov
감사합니다. 그것은 문제 일 수 있습니다. OpenSSL 방식으로 구현하는 방법을 알고 있습니까? – DieBergruft
나는 이것이 문제라고 생각하지 않는다. 문제의 핵심 샘플이 없으므로 문제가 무엇인지 말하기가 매우 어렵습니다. Snippet은 Android에서 사용할 수없는 java.util.Base64를 사용하는 것으로 보입니다. PKCS # 8과 같은 표준 형식을 사용하여 키를 전송하는 것이 어떻습니까? – divanov