1

以下のコードをnodejsに変換しようとしています。ここでjavax.crypto.Cipher Nodejs Crypto Javascriptの等価コード

public static String encrypt(String accessToken) throws Exception { 
     Cipher cipher = Cipher.getInstance("AES"); 
     String merchantKey = "11111111111111111111"; 
     String st = StringUtils.substring(merchantKey, 0, 16); 
     System.out.println(st); 
     Key secretKey = new SecretKeySpec(st.getBytes(), "AES"); 
     cipher.init(Cipher.ENCRYPT_MODE, secretKey); 
     byte[] encryptedByte = cipher.doFinal(accessToken.getBytes()); 

     // convert the byte to hex format 
     StringBuffer sb = new StringBuffer(); 
     for (int i = 0; i < encryptedByte.length; i++) { 
      sb.append(Integer.toString((encryptedByte[i] & 0xff) + 0x100, 16).substring(1)); 
     } 
     return sb.toString(); 
    } 

は私が同じ出力を得ることができないんだけど

function freeChargeEncryptAES(token){ 
    var fcKey = "11111111111111111111".substring(0, 16); 
    var cipher = crypto.createCipher('aes-128-ecb', fcKey, ""); 
    var encrypted = cipher.update(token,'ascii','hex'); 
    encrypted += cipher.final('hex'); 
    return encrypted; 
} 

をOUT-把握することができたものです。例えば

トークン=

Javaコードの出力 "ABCDEFGH" 場合 - 私は、デフォルトの暗号化アルゴリズムであることをthis answerから読んだeae7ec6943953aca94594641523c3c6d

からbc02de7c1270a352a98faa686f155df3

Nodejsコード出力aes-ecb IVを必要としない。キーの長さが16であるので、私はaes-128-ecb(16 * 8 = 128)が私が使用すべきアルゴリズムであると仮定しています。

誰かが問題を理解するのに役立つことができますか?

+0

** [ECBモード](http://crypto.stackexchange.com/q/14487/13022)**は決して使用しないでください。それは決定論的であり、したがって意味的に安全ではありません。少なくとも、[CBC](http://crypto.stackexchange.com/q/22260/13022)や[CTR](http://crypto.stackexchange.com/a/2378/)のようなランダム化モードを使用する必要があります13022)。 [パディング・オラクル攻撃](http://crypto.stackexchange.com/q/18185/13022)のような攻撃が不可能になるように、あなたの暗号文を認証する方が良いです。これは、GCMやEAXなどの認証モードや[暗号化MAC](http://crypto.stackexchange.com/q/202/13022)スキームで行うことができます。 –

+0

IVは予測不能でなければなりません(読み取り:ランダム)。静的IVを使用しないでください。これは、暗号を決定論的にし、したがって意味的に安全ではないためです。暗号文を観察する攻撃者は、同じメッセージプレフィックスがいつ送信されたかを判断できます。 IVは秘密ではないので、暗号文とともに送ることができます。通常は、単純に暗号文の前に付加され、解読の前にスライスされます。 @ArtjomB。 –

+0

情報に感謝しますが、私のユースケースは異なります。私はちょうどnodejsに上記のJavaコードを変換したい。 Java実装ではアルゴリズムは指定されませんが、デフォルトではOracle Java JCEプロバイダはECBを使用します。 –

答えて

0

ジャスト変更する必要がある -

crypto.createCipher('aes-128-ecb', fcKey, "");

crypto.createCipheriv('aes-128-ecb', fcKey, "");

理由は簡単です - createCipher方法は、第2パラメータaを扱いますそれはEncryption Keyですが、Encryption Passwordです。

悪いことに、this answerを読んだ後でも、間違った方法(crypto.createCipherivの代わりにcrypto.createCipher)を使用しました。以下はnodejsの適切な作業コードです。それはすべて必要でした。

function freeChargeEncryptAES(token){ 
    var fcKey = "11111111111111111111".substring(0, 16); 
    var cipher = crypto.createCipheriv('aes-128-ecb', fcKey, ""); 
    var encrypted = cipher.update(token,'ascii','hex'); 
    encrypted += cipher.final('hex'); 
    return encrypted; 
}