JavaScript AES暗号化[終了]


109

JavaScriptでAES 256ビット暗号化に使用できるライブラリはありますか?


crypto-js <script src = " cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/… > <script> var encryptedAES = CryptoJS.AES.encrypt を使用したAES暗号化に必要なものは次のとおりです( "Message"、 "Passphrase"); var encrypteded = CryptoJS.AES.decrypt(encryptedAES.toString()、 "Passphrase"); console.log( "Encrypted:"、encryptedAES.toString()); console.log( "復号化:"、decrypted.toString(CryptoJS.enc.Utf8)); </ script>
Hari Das

回答:


66

JSAESは、JavaScriptでのAESの強力な実装です。 http://point-at-infinity.org/jsaes/


32
JSAESはGNU GPLに基づいてライセンスされているため、一部のプロジェクトでは使用できません。
ロバート

11
これは非常に便利になり、機能豊富なcode.google.com/p/crypto-js
David Kierans '25 / 04/25

2
@HappyDeveloperそうですね。これのライセンスを非難しないでください。GPLはライブラリに適していないため、作者は間違ったライセンスを選択しました。
inta

4
これは「無料で使用できます」が、GPL以外でリリースしたい製品には使用できません。
Curtis

3
JSAESは良い出発点ですが、16バイトのデータの暗号化にのみ使用できます。より大きなデータブロックを暗号化する場合は、それを自分で拡張して、初期化ベクトル、暗号化モード(CBCまたはその他...)、パディングを実装する必要があります。
Paolo

35

以下は、slowAESを使用するデモページです。

slowAESは簡単に使用できました。論理的に設計されています。合理的なOOパッケージ。IVや暗号化モードなどのノブとレバーをサポートします。.NET / C#との良好な互換性。名前はほほえみです。C ++では実装されていないため、「低速 AES」と呼ばれます。しかし、私のテストでは、それは非現実的に遅くはありませんでした。

ECBモードがありません。また、CTRモードもありませんが、ECBモードがあればかなり簡単に作成できます。

暗号化のみに焦点を当てています。JavaScriptでRFC2898準拠のパスワードベースのキー導出を行う優れた補足クラスがAnandam から入手できます。このライブラリのペアは、類似の.NETクラスでうまく機能します。相互運用性が良好です。ただし、SlowAESとは対照的に、Javascript PBKDF2は、キーの生成時にRfc2898DeriveBytesクラスよりも著しく低速です。

技術的に優れた相互運用性があることは当然のことですが、私にとって重要な点は、SlowAESで採用されているモデルが使い慣れていて使いやすいことでした。AES用の他のJavascriptライブラリのいくつかは、理解して使用するのが難しいことがわかりました。たとえば、IVやモード(CBC、ECBなど)を設定する場所が見つからなかったものもあります。物事は私がそれらを期待していた場所ではありませんでした。SlowAESはそうではありませんでした。プロパティは、私が期待していたとおりでした。Javaと.NETの暗号化プログラミングモデルに慣れているので、簡単に習得できました。

AnandamのPBKDF2はそのレベルではありませんでした。DeriveBytes関数の呼び出しは1つしかサポートされていないため、パスワードからキーとIVの両方を取得する必要がある場合、このライブラリは変更されずに機能しません。若干の変更が加えられており、その目的のためにうまく機能しています。

編集SlowAESのパッケージングのとAnandamのPBKDF2の修正バージョンをWindowsスクリプトコンポーネントにまとめました。このAESをパスワード派生キーで使用すると、.NET RijndaelManagedクラスとの適切な相互運用が示されます。

EDIT2デモページは、WebページからこのAES暗号化を使用する方法を示しています。.NETでサポートされているのと同じ入力(iv、キー、モードなど)を使用すると、.NET Rijndaelクラスとの相互運用性が向上します。「ソースの表示」を実行して、そのページのJavaScriptを取得できます。

EDIT3
後期追加:Javascript暗号化は有害と見なされました。読む価値があります。



1
すべてのファイルがローカルに保存されているHTML 5アプリの有効な使用例が1つあります。ローカルファイルがハイジャックされる可能性がある場合は、いずれにせよあなたの運命は破滅します;-)。
Nux

8
edit3リンクについては、それは記事のがらくたの一部です...そのステートメントの半分は完全に偽です!
mmm

2
ランダムキーの問題は、ユーザーにマウスを移動させ、キーを真のランダムジェネレーターとして入力させることで解決できます。
mmm 2012年

2
デモページへのリンクが壊れているようです。
Sean

26

AES暗号化を検索したところ、Standfordの学生からこれが見つかりました。最速だと主張している。CCM、OCB、GCMおよびブロック暗号化をサポートします。 http://crypto.stanford.edu/sjcl/


それが私が話していることです!
mmm

5
ドキュメントが不足していて使いにくい。キーの長さをどのように変更しますか?私はドキュメントを探し回って、妥当な時間内にそれを理解することができませんでした。また、何かを暗号化すると、キーと値のペアの配列が返されますが、ドキュメントではこれらについて説明されていないようです。私は移動可能なタイプライブラリを使用することになりました。
CpnCrunch 2013年

そしてこれは非同期ではないので、たとえばAES-CBCを使用してより長い文字列を暗号化または復号化している場合、UIをブロックします
rsz

12

「JavaScript AES」のグーグルでいくつかの例が見つかりました。最初に表示されたものは、アルゴリズムを説明するとともにソリューションを提供するように設計されています。

可動式スクリプト:AES


1
そのライブラリーにIVを設定する方法がわかりませんでした。また、あまりオブジェクト指向ではありません。
Cheeso 2009年

カウンターモードのIVに相当するのはナンスです。この実装は、よりオブジェクト指向になるように再編成されました。カウンター(CTR)モードの操作のみが含まれます。
ChrisV

ECBモードがない場合を除いて、これはかなりうまく機能します。
CpnCrunch 2013年

10

この投稿は古いものですが、crypto-jsが最も完全なjavascript暗号化ライブラリになる可能性があります。

CryptoJSは、JavaScriptで実装された暗号アルゴリズムのコレクションです。次の暗号が含まれています:AES-128、AES-192、AES-256、DES、トリプルDES、ウサギ、RC4、RC4Dropおよびハッシャー:MD5、RIPEMD-160、SHA-1、SHA-256、SHA-512、SHA 224、256、384、または512ビットの-3。

あなたはそれらを見てみたいことがあり、クイックスタートガイドも以下のNode.jsのポートの基準としています。

node-cryptojs-aesは、crypto-jsの node.jsポートです


1
残念ながら、ドキュメントが不足しています。「クイックスタート」ガイドがあるようです。完全なドキュメントはどこにありますか?それは複数のキーの長さをサポートすると述べていますが、それを行う方法に関するドキュメントはありません。
CpnCrunch 2013年

@CpnCrunch:完全なAPIドキュメントはオンラインではありませんが、完全なjavadoc APIコメントとしてのコード。そして、あなたはそれを生成することができます。cipher-core.jsソースのコメントを読んで、暗号の鍵サイズと暗号のIVサイズを確認してください。
marcz 14年

奇妙なことに、暗号化して復号化すると、テキストが異なります
OMGPOP '19

opensslを使用しているため、いくつかの競合があります
Vlad

9

最近、JavaScriptとPythonの間で暗号化/復号化の相互運用性を実行する必要がありました。

具体的には...

1)AESを使用してJavaScriptで暗号化し、Pythonで復号化する(Google App Engine)2)RSAを使用してJavaScriptで暗号化し、Pythonで復号化する(Google App Engine)3)pycryptoを使用する

RSAとAESのさまざまなバージョンがウェブ上にたくさんあり、それらのアプローチはすべて異なっていましたが、エンドツーエンドのJavaScriptとPythonの相互運用性の良い例は見つかりませんでした。

結局、何度も試行錯誤した結果、自分のニーズに合ったものを何とかまとめることができました。

とにかく、私はjs / webappがAESと公開鍵と秘密鍵のRSAのものを使用するgoogle app engineでホストされたpythonサーバーと通信する例をノックアップしました。

同じことを実行する必要がある他の人に役立つ場合に備えて、リンクでここに含めます。

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

そして、見デモでRSA-AES-デモDOT appspotドットコム

編集:ブラウザーコンソールの出力を確認し、ソースを表示して、デモで何が行われているのかに関するヒントと有用なメッセージを取得します

編集:ソースへの非常に古く、機能していないリンクを更新して、現在指すようにしました

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


1
本当にありがとうございました!私の人生では、javascript aesをpython aesと話させることができませんでした。
スパイク

1
私は(pycryptoなどを使って)一晩中あなたのコードが10分間で達成するのに役立つことをしようと試みてきました。どうもありがとうございます!
レミーVanherweghem

1
なんらかの理由でRSAを簡単に機能させることができましたが、AESは王室の痛みです。これありがとう!!!
スピードプレーン

1
リンク...が見つかりません!
machineaddict 2016

7

私自身の経験から判断すると、asmcrypto.jsはJavaScriptで最速のAES実装を提供します(特にFirefoxでは、そこでasm.jsを完全に活用できるため)。

Readmeから:

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)

編集:ウェブ暗号化APIが今され、ほとんどのブラウザで実装し、パフォーマンスを気にしている場合、プライマリ液として使用する必要があります。IE11は、約束を使用しない標準の初期ドラフトバージョンを実装したことに注意してください。

いくつかの例がここにあります:


CryptoJSで約8 MiB /秒を取得しています。これがどのように機能するか疑問に思います。
Lodewijk 2014


3

asmcrypto.jsを試してください—とても高速です。

PS:私は著者であり、あなたの質問があれば答えることができます。また、フィードバックをいただければ幸いです:)


asmcrypto.jsはすばらしいですが、IE10ではうまく機能しません。ブラウザが1分以上、または少なくとも45秒ハングする。さらに、理解できませんでした。なぜグローバル数学関数を置き換える必要があるのですか?これを使用するライブラリはたくさんあります。
decho、2014

2
それが適切に機能していることを確認する方法についてコメントしていただけますか?IOW:AESを適切に実装したことをどのようにして知っていますか?
Lodewijk 2014

asm.jsをまったく最適化しないため、IE10のパフォーマンスは低下します。また、JITパターンも少し異なります。IEでコードを適切に機能させると、ChromeとFFでも動作しなくなります。正しい選択があったとしましょう。Math.randomに関しては長い議論がありました。まもなく言えば、生のMath.random出力リークを防止する必要性(理論的には、PRNGのセキュリティが低下する可能性があります)。
vibornoff 14



1

SSLの使用を回避するためにJavaScriptを使用しようとしている場合は、もう一度考えてください。多くの中間的な対策がありますが、SSL のみが安全な通信を提供します。JavaScript暗号化ライブラリは、特定の一連の攻撃に対しては役立ちますが、真の中間者攻撃には役立ちません。

カスタムドメインでGoogle App EngineのSSLを探している場合は、wwwizer.comをご覧ください

次の投稿では、JavaScriptを使用して安全な通信の試行を作成する方法と、それを誤解させる方法について説明してい ます。SSL/ HTTPSの代わりにJavaScript暗号化モジュールを使用してください


1
JavaScript暗号化の実装を考えている人は少なくとも検討する必要があるのは非常に良い点なので、これが忘却に反対された理由はわかりません。賛成。
ジュール

SSLを回避するためにクライアント側の暗号を使用することは古い点であり、SSLに反対する人もいます。実際、HTTPSにセキュリティを追加し、受動的な攻撃を回避したり、ダウンロードしたアプリケーションやブラウザ拡張で使用したりできます。私は一度それが間違って使用されたのを見ました(私の大学ですが、彼らはすでにそれを修正しました)そして何度も正しく使用されました(例としてcryptocat)。
グスタボロドリゲス



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.