Obecnie otrzymuję następujący błąd przy użyciu języka Java do odszyfrowania Base64 zakodowane RSA zaszyfrowany ciąg znaków, który został wykonany w C#:Wypełnienie błąd podczas korzystania z szyfrowania RSA w C# i odszyfrowywania w Javie
javax.crypto.BadPaddingException : Nie PKCS # 1 blok typu 2 lub Zero wyściółka
proces konfiguracji między wymiany z .NET i Java odbywa się poprzez utworzenie klucza prywatnego w magazynie kluczy .NET następnie z pliku PEM wydobyte, utworzonego użytku keytool do tworzenia wersji JKS z kluczem prywatnym. Java ładuje już utworzony JKS i dekoduje ciąg Base64 do tablicy bajtów, a następnie używa klucza prywatnego do odszyfrowania.
Oto kod, który mam w C#, który tworzy zaszyfrowany ciąg:
public string Encrypt(string value) {
byte[] baIn = null;
byte[] baRet = null;
string keyContainerName = "test";
CspParameters cp = new CspParameters();
cp.Flags = CspProviderFlags.UseMachineKeyStore;
cp.KeyContainerName = keyContainerName;
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp);
// Convert the input string to a byte array
baIn = UnicodeEncoding.Unicode.GetBytes(value);
// Encrypt
baRet = rsa.Encrypt(baIn, false);
// Convert the encrypted byte array to a base64 string
return Convert.ToBase64String(baRet);
}
Oto kod, który mam w Javie, który odszyfrowuje wprowadzoną ciąg:
public void decrypt(String base64String) {
String keyStorePath = "C:\Key.keystore";
String storepass = "1234";
String keypass = "abcd";
byte[] data = Base64.decode(base64String);
byte[] cipherData = null;
keystore = KeyStore.getInstance("JKS");
keystore.load(new FileInputStream(keyStorePath), storepass.toCharArray());
RSAPrivateKey privateRSAKey = (RSAPrivateKey) keystore.getKey(alias, keypass.toCharArray());
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.DECRYPT_MODE, privateRSAKey);
cipherData = cipher.doFinal(data);
System.out.println(new String(cipherData));
}
Czy ktoś widzisz brakujący krok lub gdzie należy zmienić dopełnienie lub element? Przez wiele godzin czytałem na tej stronie i innych, ale tak naprawdę nie znalazłem konkretnego rozwiązania.
Twoja pomoc jest ogromnie doceniana.
Dzięki. -Matt
Gdzie jest dopełnienie określone w kodzie C#? Skąd wiadomo, że OAEP (który jest PKCS # 1 wer. 2) nie jest używany podczas szyfrowania? – erickson
Najpierw wyizoluj szyfrowanie i kodowanie na osobne probelmy. To znaczy. sprawdź, czy zdekodowany bajt Java [] jest identyczny z oryginalnym bajtem C# []. wtedy możesz zapytać, czy jest to problem RSA, czy problem Base64. Jak powiedział erickson, prawdopodobnie jest różnica w domyślnym PKCS między bibliotekami C# i Java. –
@erickson - drugi parametr metody .NET Encrypt() wybiera padding - true określa OAEP, a false (użyte w przykładzie) określa PKCS # 1 ver 1.5. –