0

Java(Android)からNode.jsアプリケーションにデータを送信しようとしていますが、暗号化が機能しておらず、Node.jsが適切に復号化されておらず、何をしているのかわかりません。

Java:

                    // Encrypt
                    byte[] input = jo.toString().getBytes("UTF-8");

                    MessageDigest md = MessageDigest.getInstance("MD5");
                    byte[] thedigest = md.digest(ENCRYPTION_KEY.getBytes("UTF-8"));
                    SecretKeySpec skc = new SecretKeySpec(thedigest, "AES/ECB/PKCS5Padding");
                    Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
                    cipher.init(Cipher.ENCRYPT_MODE, skc);

                    byte[] cipherText = new byte[cipher.getOutputSize(input.length)];
                    int ctLength = cipher.update(input, 0, input.length, cipherText, 0);
                    ctLength += cipher.doFinal(cipherText, ctLength);
                    String query = Base64.encodeToString(cipherText, Base64.DEFAULT);

queryその後、サーバーに送信されjoJSONObject

そして、Nodeで、私は次のことを行っています。

        var decipher = crypto.createDecipher('aes-128-ecb', encryption_key);
        console.log("System: " + new Buffer(fullBuffer, "base64").toString("binary") );

        chunks = []
        chunks.push( decipher.update( new Buffer(fullBuffer, "base64").toString("binary") , 'hex', 'utf-8') );
        chunks.push( decipher.final('utf-8') );
        var txt = chunks.join("");

        console.log("System: " + txt);
        js = JSON.parse(txt);
        console.log("System: " + js);   

そしてfullBuffer、正しく転送される受信POSTデータです

4

1 に答える 1

2

暗号化と認証はデバッグに残酷です。間違いを犯すと、出力全体がランダム化されるためです。提案:

  1. 出力がどのように見えるかを確認できるように、Base64やgzipなどの暗号化されていない変換に切り替えます。
  2. どちらの半分が壊れているかを把握してみてください。サーバー出力をキャプチャし、opensslまたはpythonでデコードします。それらの1つを使用して適切な入力を生成し、それをクライアントに詰め込みます。
  3. CBCはECBよりもはるかに安全です。
  4. それでも問題が解決しない場合は、低レベルの暗号化と暗号化に踏み込んで、キーと暗号文の内容と長さが正確に一致していることを確認し、アルゴリズムの選択に目を細めてください。
于 2012-07-13T20:42:05.793 に答える