6

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

  • ile

    1. Ç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.

    2. (Düzenlendi) PKCS # 1 v2'yi (oaep) destekleyen defensivejs.com'u kullanmak için kodu değiştirin.

    Fikirler?

  • +0

    Ç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

    +0

    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

    cevap

    3
    1. Bu kod, her iki durumda da PKCS # 1 v1.5 dolgu uygulamasını gerçekleştirmektedir, tek fark utf-8 desteğidür. Bir alıcı kütüphanesi ile çalışması için, bu kütüphanenin içeriği kodladığı şekilde şifresini çözmesi gerekecektir. İyi şanslar, bunu yapan bir şey bulacağınızı düşünmüyorum. 1999'da Daniel Bleichenbacher tarafından resmedilen bir saldırı nedeniyle PKCS # 1 v1.5 dolgu insecure şeklindedir. Günümüzde PKCS # 1 v2.x kullanılması tavsiye edilir. Wu'nun kodu bunu desteklemiyor. Gerçekten bu kitaplığı (ben buna karşı tavsiye) kullanmak istiyorsa

    2. , muhtemelen en temiz yaklaşım bunu şifrelemek ("E0F8AD4092F81FC401E60ECB7F5B8F1A") önce kodlanmış anahtar hex gönderip decrypt sonra deşifre emin alıcı onaltılık yapmaktır : Bu Wu'nun UTF-8 ayarlarında çalışacaktı. Base64 kodlama/kod çözme de kullanabilirsiniz.

    3. SJCL, çok daha iyi bir JavaScript şifreleme kitaplığıdır ve bu gibi sorunlara karşı çok karşılaşmayacaksınız. Bilgime göre, Wu'nun kodu harika kimlik doğrulama protokolünün bir PoC'si olarak tasarlandı. SJCL daha genel kullanım için tasarlandı ve bir topluluk tarafından sürdürülüyor.

    +0

    Ne yazık ki SJCL kütüphanesi RSA'yı desteklemiyor gibi görünüyor. Şifre çözme aygıtı Thales HSM Payshield 9000 (https://en.wikipedia.org/wiki/Hardware_security_module) olduğu için RSA şarttır. HSM, PKCS # 1 v2 (OEAP) – andyvan

    +0

    'u desteklemektedir Mevcut uygulama sadece bir kez/ortak anahtar çiftini kullanır. Sunucu bir istek aldığında, bilgi işlenir (başarı veya başarısızlık) ve ardından anahtarlar silinir ve tekrar kullanılmaz. Bu kullanım durumuna dayanarak, Bleichenbacher'in CCA saldırısının uygulanamayacağını tahmin ediyorum. Bir saldırganın rastgele verilerle istekleri yeniden denemesi için bir fırsat yoktur. – andyvan

    +0

    @andyvan holy poop batman, haklısın! Hayal kırıklığı! Ayrıca Google tarafından bir kütüphane de düşünebilirsiniz, ancak bunun ne kadar zor olduğunu veya ne kadar olgun olduğunu bildiğinizden emin olun: https://github.com/google/end-to-end/blob/master/src/javascript /crypto/e2e/asymmetric/rsa.js. Arıza durumunda anahtarlar silinirse,. Saldırının geçerli olmayacağından eminsiniz. – TheGreatContini