2


Java で暗号化し、node.js で復号化する必要があります。復号結果が壊れています。

Javaコードは次のとおりです。

    public String encrypt(SecretKey key, String message){ 
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");              
        cipher.init(Cipher.ENCRYPT_MODE, key);        
        byte[] stringBytes = message.getBytes("UTF8");       
        byte[] raw = cipher.doFinal(stringBytes);

        // converts to base64 for easier display.
        BASE64Encoder encoder = new BASE64Encoder();
        String base64 = encoder.encode(raw);

        return base64;

    }

node.js コードは次のとおりです。

    AEse3SCrypt.decrypt = function(cryptkey,  encryptdata) {
    encryptdata = new Buffer(encryptdata, 'base64').toString('binary');

    var decipher = crypto.createDecipher('aes-128-cbc', cryptkey);
    decipher.setAutoPadding(false);
    var decoded  = decipher.update(encryptdata);

    decoded += decipher.final();
    return decoded;
  }

  As a key I use: "[B@4ec6948c"
  The jave encrypted result is: "dfGiiHZi8wYBnDetNhneBw=="<br>
  The node.js result is garbich....
  1. Java では「PKCS5Padding」を使用します。パディングに関してnode.jsで何をすべきですか? setAutoPadding(false)にしました。そうしないと、解読に失敗するというエラーが発生します。(node.js バージョン 0.8 以降のみ)。
  2. node.js を補完するために Java から utf8 エンコーディングを削除しようとしましたが、うまくいきませんでした。何が間違っているのですか?
4

1 に答える 1

1

私が使用するキーとして: "[B@4ec6948c"

toString()バイト配列を呼び出しているように聞こえます。これは、バイト配列内のデータObject.toString()を提供するものではありません。これは、バイト配列で呼び出されるのデフォルトの実装にすぎません。

Arrays.toString(key)を使用してキーを印刷してみてください。

node.js コードでその破損したキー値を使用していた場合、ガベージ バックが発生するのも不思議ではありません。

node.jsを補完するために、Javaからutf8エンコーディングを削除しようとしました

それは絶対に間違ったアプローチです。代わりに、node.js コードがプレーンテキスト データを UTF-8 でエンコードされたテキストとして解釈するようにする方法を検討する必要があります。基本的に、文字列は文字データであり、暗号化はバイナリ データに作用します。ギャップを埋める方法が必要であり、UTF-8 はそのための完全に合理的な方法です。node.js での復号化の最初の結果はバイナリ データである必要があり、これを UTF-8 経由でテキストに「デコード」します。

残念ながら、パディング側についてコメントするには十分な知識がありません。

于 2012-10-02T06:34:12.853 に答える