Javascript AES şifrelemesi [kapalı]


109

Javascript'te AES 256 bit şifreleme için bir kitaplık var mı?


İşte crypto -js <script src = " cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/… > <script> var encryptedAES = CryptoJS.AES.encrypt kullanarak AES şifrelemesi için ihtiyacınız olan şey. ("Mesaj", "Parola"); var decrypted = CryptoJS.AES.decrypt (encryptedAES.toString (), "Parola"); console.log ("Şifrelenmiş:", encryptedAES.toString ()); console.log ( "Decrypted:", decrypted.toString (CryptoJS.enc.Utf8)); </script>
Hari Das

Yanıtlar:


66

JSAES, JavaScript'te AES'nin güçlü bir uygulamasıdır. http://point-at-infinity.org/jsaes/


32
JSAES, GNU GPL altında lisanslanmıştır - bu nedenle bazı projeler için kullanılamaz.
Robert

11
Bu artık oldukça kullanışlı ve zengin özelliklere sahip code.google.com/p/crypto-js
David Kierans

2
@HappyDeveloper Hayır. Bunun için lisansı suçlamayın. Yazar, GPL kütüphaneler için uygun olmadığından yanlış lisansı seçti.
inta

4
"Kullanımı ücretsizdir", ancak sonuçta ortaya çıkan ürününüzü GPL dışında bir şey altında yayınlamak istiyorsanız onu kullanamazsınız.
Curtis

3
JSAES iyi bir başlangıç ​​noktasıdır ancak yalnızca 16 baytlık veriyi şifrelemek için kullanılabilir. Daha büyük bir veri bloğunu şifrelemek istiyorsanız, bunu, başlangıç ​​vektörü, şifreleme modu (CBC veya başka ...), dolgu uygulamak için kendiniz genişletmelisiniz.
Paolo

35

İşte slowAES kullanan bir tanıtım sayfası .

slowAES'in kullanımı kolaydı. Mantıksal olarak tasarlanmıştır. Makul OO ambalajı. IV ve Şifreleme modu gibi düğmeleri ve kolları destekler. .NET / C # ile iyi uyumluluk. İsim yanak dilidir; C ++ 'da uygulanmadığı için buna " yavaş AES" denir . Ancak testlerimde pratik olarak yavaş olmadı.

ECB modu yok. Ayrıca, bir ECB modu verildiğinde oldukça kolay bir şekilde oluşturabilmenize rağmen, bir TO modu yok.

Yalnızca şifrelemeye odaklanır. Javascript'te RFC2898 uyumlu parola tabanlı anahtar türetme yapan güzel bir tamamlayıcı sınıf, Anandam'dan edinilebilir . Bu kitaplık çifti, benzer .NET sınıflarıyla iyi çalışır. İyi birlikte çalışma. Bununla birlikte, SlowAES'in aksine, Javascript PBKDF2, anahtarlar oluştururken Rfc2898DeriveBytes sınıfından belirgin ölçüde daha yavaştır .

Teknik olarak iyi bir birlikte çalışmanın olması şaşırtıcı değil, ancak benim için kilit nokta, SlowAES tarafından benimsenen modelin tanıdık ve kullanımının kolay olmasıydı. AES için diğer bazı Javascript kitaplıklarının anlaşılması ve kullanılması zor buldum. Örneğin, bazılarında IV'ü veya modu (CBC, ECB, vb.) Ayarlamak için yer bulamadım. İşler beklediğim yerde değildi. SlowAES öyle değildi. Mülkler tam olmasını beklediğim yerdeydi. Java ve .NET kripto programlama modellerine aşina olduğum için öğrenmesi kolaydı.

Anandam'ın PBKDF2'si o düzeyde değildi. DeriveBytes işlevine yalnızca tek bir çağrıyı desteklediğinden, bir paroladan hem bir anahtar hem de bir IV türetmeniz gerekirse, bu kitaplık değişmeden çalışmaz. Küçük bir değişiklik ve bu amaç için gayet iyi çalışıyor.

DÜZENLEME : Ben araya bir örnek ambalaj SlowAES ve Anandam en değiştirilmiş bir sürümü PBKDF2 Windows komut dosyası bileşenleri içine. Bu AES'yi paroladan türetilmiş bir anahtarla kullanmak, .NET RijndaelManaged sınıfı ile iyi bir etkileşim olduğunu gösterir.

DÜZENLEME2 : demo sayfası , bir web sayfasından bu AES şifrelemesinin nasıl kullanılacağını gösterir. .NET'te desteklenen aynı girişleri (iv, anahtar, mod, vb.) Kullanmak, .NET Rijndael sınıfıyla iyi bir etkileşim sağlar. O sayfa için javascript almak için bir "kaynağı görüntüle" yapabilirsiniz.

EDIT3
geç bir ekleme: Javascript Cryptography zararlı kabul edildi. Okumaya değer.



1
Geçerli bir kullanım durumu görüyorum - tüm dosyaların yerel olarak depolandığı HTML 5 uygulaması. Yerel dosyalar ele geçirilebilirse, her durumda mahkumunuz ;-).
Nux

8
edit3 bağlantısı hakkında, bir makalenin boktan bir parçası ... ifadelerinin yarısı tamamen yanlış!
mmm

2
Rastgele anahtar sorunu, kullanıcının fareyi hareket ettirmesi ve gerçek bir rastgele üretici olarak tuşları girmesi ile çözülebilir.
mmm

2
Demo sayfasının bağlantısı kesik görünüyor.
Sean

26

AES şifreleme araştırmalarımda bunu bazı Standford öğrencilerinden buldum. Orada en hızlı olduğunu iddia ediyor. CCM, OCB, GCM ve Blok şifrelemeyi destekler. http://crypto.stanford.edu/sjcl/


Ben bundan bahsediyorum!
mmm

5
Belgeler eksik ve kullanımı zor. Anahtar uzunluğunu nasıl değiştirirsiniz? Doktorları araştırdım ve makul bir sürede çözemedim. Ayrıca bir şeyi şifrelediğinizde, döndürülen bir dizi anahtar-değer çifti elde edersiniz, ancak belgeler bunları açıklamıyor gibi görünüyor. Taşınabilir tür kitaplığını kullanmayı bıraktım.
CpnCrunch

Ve bu eşzamansız değildir, bu nedenle, örneğin AES-CBC ile daha uzun bir dizeyi şifreler veya deşifre
ediyorsanız

12

Googling "JavaScript AES" birkaç örnek buldu. Açılan ilki, algoritmayı açıklamak ve bir çözüm sağlamak için tasarlanmıştır:

Taşınabilir Tip Komut Dosyaları: AES


1
Serumu o kütüphaneye nasıl yerleştireceğimi bulamadım. Ayrıca çok OO değil.
Cheeso

Sayaç modunda IV'ün eşdeğeri nonce'dir. Bu uygulama daha çok OO olacak şekilde yeniden formüle edildi. Yalnızca sayaç (CTR) çalışma modunu içerir.
ChrisV

Bu, herhangi bir ECB moduna sahip olmaması dışında oldukça iyi çalışıyor.
CpnCrunch

10

Bu gönderi artık eski, ancak crypto-js şu anda en eksiksiz javascript şifreleme kitaplığı olabilir.

CryptoJS , JavaScript'te uygulanan bir şifreleme algoritmaları koleksiyonudur. Aşağıdaki şifreleri içerir: AES-128, AES-192, AES-256, DES, Triple DES, Rabbit, RC4, RC4Drop ve hashers: MD5, RIPEMD-160, SHA-1, SHA-256, SHA-512, SHA -3, 224, 256, 384 veya 512 bit.

Aşağıdaki node.js bağlantı noktası için de referans olan Hızlı Başlangıç ​​Kılavuzuna bakmak isteyebilirsiniz .

düğüm cryptojs AES bir node.js liman cryptojs


1
Maalesef belgeler eksik. Görünüşe göre sadece 'hızlı başlangıç' kılavuzu var. Belgelerin tamamı nerede? Birden çok anahtar uzunluğunu desteklediğini söylüyor, ancak bunun nasıl yapılacağına dair belge yok.
CpnCrunch

@CpnCrunch: tam API dokümanı çevrimiçi değil, kod tam javadoc api yorumları olarak. Ve onu üretebilirsiniz. Cipher-core.js kaynağındaki yorumları okuyun ve şifrenin anahtar boyutunu ve şifrenin IV boyutunu bulabilirsiniz.
marcz

tuhaf, şifrelediğimde ve şifresini
çözdüğümde

Openssl kullanımından dolayı bazı çatışmalar var
Vlad

9

Son zamanlarda javascript ve python arasında bazı şifreleme / şifre çözme birlikte çalışabilirliği gerçekleştirme ihtiyacım vardı.

Özellikle ...

1) Javascript'te şifrelemek ve python'da şifresini çözmek için AES'i kullanma (Google App Engine) 2) Javascript'te şifrelemek ve python'da şifresini çözmek için RSA kullanma (Google App Engine) 3) Pycrypto kullanma

Web'de dolaşan çok sayıda farklı RSA ve AES sürümü buldum ve yaklaşımlarında hepsi farklıydı, ancak uçtan uca javascript ve python birlikte çalışabilirliği için iyi bir örnek bulamadım.

Sonunda, birçok deneme yanılma sonrasında ihtiyaçlarıma uygun bir şeyi bir araya getirmeyi başardım.

Her neyse, AES ve genel anahtar ve özel anahtar RSA öğeleri kullanan bir google uygulama motoru barındırılan python sunucusuyla konuşan bir js / webapp örneğini aldım.

Aynı şeyi başarmaya ihtiyaç duyan başkalarına da bir faydası olması durumunda, buraya bağlantı yoluyla eklemeyi düşündüm.

http://www.ipowow.com/files/aesrsademo.tar.gz

ve görün demo de rsa-aes-demo DOT appspot DOT com

düzenleme: tarayıcı konsolu çıktısına bakın ve ayrıca demoda neler olup bittiğine ilişkin bazı ipuçları ve faydalı mesajlar almak için kaynağı görüntüleyin

düzenleme: çok eski güncellendi ve şu anda kaynağa giden bağlantı geçersiz

https://sestertii.com/files/aesrsademo.tar.gz


1
Bunun için çok teşekkür ederim! Hayatım boyunca javascript aes'imi python aes'imle konuşturamadım.
Spike

1
Bütün gece (pycrypto ve diğerleriyle) kodunuzun 10 dakika içinde başarmama yardımcı olduğu şeyi yapmaya çalıştım. Çok teşekkür ederim!
Remy Vanherweghem

1
Her ne sebeple olursa olsun RSA'yı kolayca çalıştırdım ama AES bir kraliyet acısı. Bunun için teşekkür ederim!!!
uçak

1
bağlantı ... bulunamadı!
machineaddict

7

Kendi deneyimlerime göre, asmcrypto.js JavaScript'te en hızlı AES uygulamasını sağlar (özellikle Firefox'ta asm.js'den tamamen yararlanabildiği için).

Benioku'dan:

Chrome/31.0
SHA256: 51 MiB/s (9 times faster than SJCL and CryptoJS)
AES-CBC: 47 MiB/s (13 times faster than CryptoJS and 20 times faster than SJCL)

Firefox/26.0
SHA256: 144 MiB/s (5 times faster than CryptoJS and 20 times faster than SJCL)
AES-CBC: 81 MiB/s (3 times faster than CryptoJS and 8 times faster than SJCL)

Düzenleme: Web Kriptografi API şimdi olduğu birçok tarayıcıda uygulanan ve performanstaki veriyorsan birincil çözüm olarak kullanılmalıdır. IE11'in, vaatleri kullanmayan, standardın daha önceki bir taslak sürümünü uyguladığını unutmayın.

Bazı örnekler burada bulunabilir:


CryptoJS ile yaklaşık 8 MiB / s alıyorum. Bunun nasıl performans göstereceğini merak ediyorum.
Lodewijk


3

Asmcrypto.js'yi deneyin - gerçekten hızlı.

Not: Ben bir yazarım ve varsa sorularınıza cevap verebilirim. Ayrıca geri bildirim almaktan memnuniyet duyarım :)


asmcrypto.js güzel, ancak IE10'da iyi çalışmıyor. bazen 1 dakikadan fazla veya en az 45 saniye süreyle tarayıcıyı kapatır. Artı, anlamadım, neden global Math işlevini değiştirmeniz gerekiyor? bunu kullanan birçok kütüphane var.
decho

2
Doğru çalıştığından nasıl emin olduğunuz hakkında yorum yapabilir misiniz? IOW: AES'i doğru şekilde uyguladığınızı nasıl anlarsınız?
Lodewijk

Asm.js'yi hiç optimize etmediği için IE10 performansı zayıf. Ayrıca biraz farklı JIT modellerine sahiptir. Kodun IE'de iyi çalışmasını sağlamak, aynı zamanda Chrome ve FF'de de emilmesini sağlar. Doğru seçim yaptığımı varsayalım. Math.random ile ilgili uzun bir tartışma oldu . Kısaca konuşursak, bu ham Math.random çıktı sızıntısının önlenmesine yönelik ihtiyaç (ki bu teorik olarak PRNG güvenliğini bozabilir).
vibornoff



1

SSL kullanmaktan kaçınmak için javascript kullanmaya çalışıyorsanız, tekrar düşünün. Pek çok yarı yol önlemi vardır, ancak yalnızca SSL güvenli iletişim sağlar. Javascript şifreleme kitaplıkları belirli saldırılara karşı yardımcı olabilir, ancak gerçek bir ortadaki adam saldırısına karşı değil.

Özel bir etki alanında google uygulama motoru için SSL arıyorsanız, wwwizer.com adresine bir göz atın .

Aşağıdaki gönderi, javascript ile nasıl güvenli iletişim girişiminin oluşturulacağını ve bunun nasıl yanlış yapılacağını açıklamaktadır: SSL / HTTPS yerine JavaScript şifreleme modülünü kullanın


1
Javascript şifrelemesini uygulamayı düşünen herkesin en azından dikkate alması gereken çok iyi bir nokta olduğundan, bunun neden unutulmaya başlandığından emin değilim. Upvoted.
Jules

SSL'den kaçınmak için istemci tarafı kripto kullanmak, bazılarının buna karşı çıktığını söylediği eski bir noktadır: aslında HTTPS'ye güvenlik katabilir, pasif saldırılardan kaçınabilir veya indirilen uygulamalarda ve tarayıcı uzantılarında kullanılabilir. Sadece bir kez yanlış kullanıldığını gördüm (üniversitem, ama zaten düzeltti) ve çoğu zaman doğru kullanıldı (örnek olarak kripto kedi).
Gustavo Rodrigues



Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.