以下のコードを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)が私が使用すべきアルゴリズムであると仮定しています。
誰かが問題を理解するのに役立つことができますか?
** [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)スキームで行うことができます。 –
IVは予測不能でなければなりません(読み取り:ランダム)。静的IVを使用しないでください。これは、暗号を決定論的にし、したがって意味的に安全ではないためです。暗号文を観察する攻撃者は、同じメッセージプレフィックスがいつ送信されたかを判断できます。 IVは秘密ではないので、暗号文とともに送ることができます。通常は、単純に暗号文の前に付加され、解読の前にスライスされます。 @ArtjomB。 –
情報に感謝しますが、私のユースケースは異なります。私はちょうどnodejsに上記のJavaコードを変換したい。 Java実装ではアルゴリズムは指定されませんが、デフォルトではOracle Java JCEプロバイダはECBを使用します。 –