Attualmente mi sto ricevendo il seguente errore quando si utilizza Java per decifrare un Base64 codificato RSA stringa crittografata che è stato fatto in C#:errore di riempimento quando si utilizza RSA di crittografia in C# e la decrittografia in Java
javax.crypto.BadPaddingException : Non PKCS # 1 tipo di blocco 2 o zero padding
il processo di installazione tra la centrale da .NET e Java è fatto con la creazione di una chiave privata nell'archivio chiavi .NET poi dal file PEM estratto, l'uso creato keytool per creare una versione di JKS con la chiave privata. Java carica il JKS già creato e decodifica la stringa Base64 in una matrice di byte e quindi utilizza la chiave privata per decodificare.
Ecco il codice che ho in C# che crea la stringa crittografata:
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);
}
Ecco il codice che ho in Java che decifra la stringa immessa:
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));
}
C'è qualcuno vedi un passo mancante o dove il padding o l'oggetto deve essere cambiato? Ho fatto ore di lettura su questo sito e su altri, ma non ho davvero trovato una soluzione concreta.
Il vostro aiuto è molto apprezzato.
Grazie. -Matt
Dove si trova il padding specificato nel codice C#? Come sai che OAEP (che è PKCS # 1 ver. 2) non viene utilizzato durante la crittografia? – erickson
Per prima cosa isolare la crittografia e la codifica in probelms separati. Vale a dire. convalidare che il byte Java decodificato [] è identico al byte C# originale []. quindi puoi chiedere se è un problema RSA o un problema Base64. Come ha detto erickson, probabilmente è la differenza nel PKCS predefinito tra C# e le librerie Java. –
@erickson - il secondo parametro del metodo .NET Encrypt() seleziona il padding - true specifica OAEP e false (utilizzato nell'esempio) specifica PKCS # 1 ver 1.5. –