Wie verwende ich RSA zwischen Server und GWT-Client?
Ich möchte Daten zwischen einem Java Server-Backend und einem GWT-Client verschlüsseln. Auf dem GWT-Client verwende ich das sbn.js Bibliothek. Es funktioniert sehr schnell und ist viel schneller als gwt-crypto.
Hier ist angegeben, wie ich auf der Clientseite verschlüssele (e, n) von RSA. Ich habe ein @ erstel JSFiddle:
var n = "BC86E3DC782C446EE756B874ACECF2A115E613021EAF1ED5EF295BEC2BED899D26FE2EC896BF9DE84FE381AF67A7B7CBB48D85235E72AB595ABF8FE840D5F8DB";
var e = "3";
var d = "7daf4292fac82d9f44e47af87348a1c0b9440cac1474bf394a1b929d729e5bbcf402f29a9300e11b478c091f7e5dacd3f8edae2effe3164d7e0eeada87ee817b";
function do_encrypt() {
var before = new Date();
var rsa = new RSAKey();
rsa.setPublic(n, e);
var res = rsa.encrypt($("#plaintext").val());
$("#ciphertext").val(res);
$("#cipherb64").val(hex2b64(res));
console.log("res");
}
$("#encrypt").click(function () {
do_encrypt();
});
Ich verwende die hexadezimale Darstellung des verschlüsselten Klartextes, der auf dem Server entschlüsselt werden soll. Hier ist, wie ich auf dem Server entschlüssle.
Ich benutze die folgenden Bibliotheken:
compile 'org.bouncycastle:bcprov-jdk15on:1.51'
compile 'org.bouncycastle:bcprov-ext-jdk15on:1.51'
Hier ist, wie ich auf dem Server mit (d, n) von RSA entschlüsseln:
try {
BigInteger modulus = new BigInteger("BC86E3DC782C446EE756B874ACECF2A115E613021EAF1ED5EF295BEC2BED899D26FE2EC896BF9DE84FE381AF67A7B7CBB48D85235E72AB595ABF8FE840D5F8DB",16);
BigInteger exponent = new BigInteger("3");
RSAKeyParameters publicKey = new RSAKeyParameters(false, modulus, exponent)
BigInteger exponent2 = new BigInteger("7daf4292fac82d9f44e47af87348a1c0b9440cac1474bf394a1b929d729e5bbcf402f29a9300e11b478c091f7e5dacd3f8edae2effe3164d7e0eeada87ee817b", 16);
RSAKeyParameters privateKey = new RSAKeyParameters(true, modulus, exponent2)
String encryptedData = "a7f7d5c77c246729141cdfcc77f1f7b38d5f8066b0bc53b2e85119f3f1784f43be2140b5c382ad483bb57cc1b586962cbb1e831e6070a27e4880bbc549e20a372571d09c6b1269ddd7288916f10c96a9138f4165569c4767bfb489de2d44b450ed1495c99da985dc264dabadd9709ccd950ae55095373ccbc3344a26b3efd2dc";
////// decrypt
AsymmetricBlockCipher d = new RSAEngine();
d = new PKCS1Encoding(d);
d.init(false, privateKey);
byte[] messageBytes2 = new BigInteger(encryptedData,16).toByteArray();
byte[] hexEncodedCipher2 = d.processBlock(messageBytes2, 0, messageBytes2.length);
println("encrypted:"+new String(hexEncodedCipher2));
}
catch(Exception e) {
e.printStackTrace()
println "#################### error"
}
Ich habe die folgende Ausnahme:
Error |
org.bouncycastle.crypto.DataLengthException: input too large for RSA cipher.
Ich nehme an, dass die Zeile println ("encrypted:" + new String (hexEncodedCipher2)); ist das Problem
Wie kann ich clientseitig entschlüsseln?
Warum erhalte ich bei jeder Ausführung der clientseitigen Verschlüsselung unterschiedliche Verschlüsselungen mit demselben (e, n) und demselben Klartext?