Bir tarayıcıda ASCII dizesini şifrelemek için http://www-cs-students.stanford.edu/~tjw/jsbn/'dan rsa.js v1.0 kullanıyorum. Dize, aslında çift uzunluklu bir TripleDes anahtarı içeren 16 baytlık bir dizidir. Rsa v1.0 ile bu çalışır. Bayt dizisi, sunucuda (Bouncy Castle veya Thales HSM kullanılarak) 16 bayt dizisi olarak doğru şekilde çözülür.javascript içinde RSA artık ASCII/byte dizilerini desteklemiyor
örn.
var zpk = hex2a("E0F8AD4092F81FC401E60ECB7F5B8F1A");
var rsa = new RSAKey();
rsa.setPublic(modulus, exponent);
var res = rsa.encrypt(zpk);
if (res) {
document.rsatest.zpkrsa.value = hex2b64(res);
}
rsa.js v1.4 taşınırken, bu daha uzun süre çalışmaz. Bouncy kalesi verileri çözer, ancak bir 16 bayt dizisi yerine, şimdi 25 baytlık bir dizidir.
ben rsa.js kütüphanede görebilirsiniz önemli fark v1.1 sürüm notlarında geçerli: ASCII olmayan karakterler utf-8 kodlama için
destek eklendi zaman PKCS1 kodlama ve JavaScript dizeleri çözme.
v1.0 PKCS # 1 doldurma olup:
// PKCS#1 (type 2, random) pad input string s to n bytes, and return a bigint
function pkcs1pad2(s, n) {
if (n < s.length + 11) {
alert("Message too long for RSA");
return null;
}
var ba = new Array();
var i = s.length - 1;
while (i >= 0 && n > 0) ba[--n] = s.charCodeAt(i--);
ba[--n] = 0;
var rng = new SecureRandom();
...
return new BigInteger(ba);
}
PKCS # 1 doldurma v1.1 fonksiyonu ve daha sonra ise:
// PKCS#1 (type 2, random) pad input string s to n bytes, and return a bigint
function pkcs1pad2(s,n) {
if(n < s.length + 11) { // TODO: fix for utf-8
console.error("Message too long for RSA");
return null;
}
var ba = new Array();
var i = s.length - 1;
while(i >= 0 && n > 0) {
var c = s.charCodeAt(i--);
if(c < 128) { // encode using utf-8
ba[--n] = c;
}
else if((c > 127) && (c < 2048)) {
ba[--n] = (c & 63) | 128;
ba[--n] = (c >> 6) | 192;
}
else {
ba[--n] = (c & 63) | 128;
ba[--n] = ((c >> 6) & 63) | 128;
ba[--n] = (c >> 12) | 224;
}
}
ba[--n] = 0;
...
return new BigInteger(ba);
}
rsa.js v1.0 her karakteri 1 bayt karakter olarak ele aldı. V1.1 karakterleri, çoklu bayt utf-8 olup olmadıklarını görmek için test edildiğinden. rsa.js v1.0
- Çubuk beni devre dışı bırakmak için izin rsa.js (ve rsa2.js) değiştirilmiş bir sürümünü oluşturun:
O benim tek seçenek birine gibi görünüyor utf-8 karakter algılama.
- (Düzenlendi) PKCS # 1 v2'yi (oaep) destekleyen defensivejs.com'u kullanmak için kodu değiştirin.
Fikirler?
Çok fazla baş ağrısına neden olabilecek PKCS sürümünde farklılıklar ilginç olabilir. Bu kitaplık yerine [Stanford JavaScript Kripto Kütüphanesi] (https://github.com/bitwiseshiftleft/sjcl) kullanmayı denemenizi şiddetle öneririm çünkü SJCL'nin daha yaygın olarak kullanıldığını ve test edildiğini biliyorum. – TheGreatContini
Evet, Wu'nun kütüphanesinin Bleichenbacher saldırısına karşı savunmasız olabilecek [PCKS # 1 v1.5] (https://tools.ietf.org/html/rfc2313) uygulandığından emin olabilirsiniz. Bir kriptograf olarak, bu kodu kullanmamanızı tavsiye ederim! Bunun yerine SJCL kullanın! – TheGreatContini