2017-12-08 30 views
2

こんにちは、 私はDartでAES暗号化と解読の例を持っています。私はそれを行うのを助けることができるダーツ暗号化解読AESの例

https://www.dartdocs.org/documentation/cipher/0.3.0/cipher.api/cipher.api-library.html

暗号ライブラリがあるダートで見ました。しかし、私はここで2つの問題があります。

  • 文字列を暗号化する簡単な例を、初期文字列を取得し、それを復号化します。

  • 他のAESライブラリと一緒に動作する必要があります。すべてが標準に準拠していると仮定します。特に、ダーツにフロントエンドを、C++にバックエンドを用意しています。その目的のために暗号++を使用する予定です。ポイントは暗号++であり、必要な入力はキーと初期化ベクトル(IV)ですが、Dart/cipherではIVが必要ないようです。私は、入力要件が異なるかどうか、彼らは一緒に働くことができなかったのだろうか。

誰かが驚くほど私を助ける2つの入力キーとIVの文字列を、暗号化/復号化することができます任意のライブラリ(暗号化/暗号)とダートの使用例を助けることができるかどうか結論、。

はそれはそうというだけの理由で、私は完全なサンプルコードを提供するつもりはないが、あなたはダーツの暗号化を使用したい場合は、あなたがカウンタモード(CTR)の暗号化と一緒に行くべきであるあなたのすべての

+1

Dart CipherのドキュメントはPOSであり、基本的に情報を提供しないため、相互運用性が困難になります。ドキュメントから:「クラスの大半はBouncy Castle of JavaからDartへのポートです」ので、Bouncy Castleのドキュメントに行き、それらをDartにどのように適用するかを試してみる必要があります。ベストケース:使用しないでください。 – zaph

答えて

3

ありがとうございましたDartによって実装された唯一の実際のAES暗号モードです。

CTRはSICモードとも呼ばれ、実装はhereです。有用にはParametersWithIVを使用します。ランダム化されていないノンセンスを使用する場合は、IVの最後に高位に配置する必要があります(左端、バイトインデックス0から始まる、通常CTRモードはビッグエンディアンです)。

1

私は最終的に私の暗号解読の例の仕事を得るので、私は私の質問に答える。最も簡単な方法は、Salsa20アルゴリズムを使用し、すべてを16進文字列に変換してからシリアル化して送信することです。すべての16進文字列

  • シリアライズする文字列
  • エンコード暗号化されたデータをヘクスして取得するためにネットワーク・デコードのもう一方の端にネットワーク
  • て16進数文字列を送信するために

    • 暗号化データ
    • エンコードIV IVおよび暗号化されたデータ。
    • は次に以下

    データを解読するために同じIV、(暗黙的に同じになるように設定される)同じキーを使用すると、ネットワークを介して送信することなく復号化/暗号化コードです。

    import "dart:typed_data"; 
    import 'dart:convert'; 
    import "package:cipher/cipher.dart"; 
    import "package:cipher/impl/base.dart"; 
    
    Uint8List StringToUint8List(String s) { 
        var ret = new Uint8List(s.length); 
        for(var i=0 ; i<s.length ; i++) { 
        ret[i] = s.codeUnitAt(i); 
        } 
        return ret; 
    } 
    
    /// UTF16 Decoding 
    String Uint8ListToString(Uint8List ui) { 
        String s = new String.fromCharCodes(ui); 
        return s; 
    } 
    
    void main() { 
        initCipher(); 
        final testStr = "Hello, i am a very very very very very very very very long string, please encrypte me"; 
        final ivStr = "2urPAr4H"; // Need to have size 8 
        final keyStr = "QuJuesMhcssE4e8Q4Kt1XCJW3tcpzcEI"; // Need to have size 32 
    
        final _ivEncoded = UTF8.encode(ivStr); 
        final _keyEncoded = UTF8.encode(keyStr); 
        final _key = new KeyParameter(_keyEncoded); 
        final params = new ParametersWithIV(_key,_ivEncoded); 
    
        var cipher = new StreamCipher("Salsa20"); 
        cipher..reset()..init(true, params); 
        var encryptedEncodedData = cipher.process(StringToUint8List(testStr)); 
        var encryptedDataStr = Uint8ListToString(encryptedEncodedData); 
    
        cipher..reset()..init(false, params); 
        var dencryptedEncodedData = cipher.process(StringToUint8List(encryptedDataStr)); 
        var dencryptedDataStr = Uint8ListToString(dencryptedEncodedData); 
        //expect(testStr, dencryptedDataStr); 
    }