DES 暗号化を使用する C# 暗号化方式があります。私が作成しているnode.js APIでその値を復号化する必要があります。API で復号化メソッドのほとんどを再作成することができましたが、復号化するシークレットと値を渡すと、別の結果が得られます。
暗号化.cs
public static string Encrypt(string toEncrypt, string key)
{
var des = new DESCryptoServiceProvider();
var ms = new MemoryStream();
des.Key = HashKey(key, des.KeySize / 8);
des.IV = HashKey(key, des.KeySize / 8);
string s = Encoding.UTF8.GetString (des.Key);
des.IV = Encoding.UTF8.GetBytes (key);
byte[] inputBytes = Encoding.UTF8.GetBytes(toEncrypt);
var cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
cs.Write(inputBytes, 0, inputBytes.Length);
cs.FlushFinalBlock();
return HttpServerUtility.UrlTokenEncode(ms.ToArray());
}
public static string Decrypt(string toDecrypt, string key)
{
var des = new DESCryptoServiceProvider();
var ms = new MemoryStream();
des.Key = HashKey(key, des.KeySize / 8);
des.IV = HashKey(key, des.KeySize / 8);
byte[] inputBytes = HttpServerUtility.UrlTokenDecode(toDecrypt);
var cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
cs.Write(inputBytes, 0, inputBytes.Length);
cs.FlushFinalBlock();
var encoding = Encoding.UTF8;
return encoding.GetString(ms.ToArray());
}
public static byte[] HashKey(string key, int length)
{
var sha = new SHA1CryptoServiceProvider();
byte[] keyBytes = Encoding.UTF8.GetBytes(key);
byte[] hash = sha.ComputeHash(keyBytes);
byte[] truncateHash = new byte[length];
Array.Copy(hash, 0, truncateHash, 0, length);
return truncateHash;
}
これは私が継承したコードです。これまでのところ、これを再作成することができました。
app.js
var keyHex = 'Secret'
var ciphertext = 'EncryptedValue'
// Decrypt
var keyBytes = CryptoJS.enc.Utf8.parse(keyHex)
var sh1KeyVal = CryptoJS.SHA1(keyBytes)
var trunc = convertWordArrayToUint8Array(sh1KeyVal).slice(0, 8)
var decoded = decodeURI(ciphertext)
var key = trunc.toString(CryptoJS.enc.Utf8)
var bytes = CryptoJS.DES.decrypt(decoded, key, { iv: key });
var originalText = bytes.toString(CryptoJS.enc.Utf8);
console.log('Message: ', originalText);
シークレットのハッシュ プロセスは、私が再作成できたものtrunc
であり、APIの値がHashKey
メソッドが出力するバイト配列と同じであることを確認しました。
ただし、var bytes = CryptoJS.DES.decrypt(decoded, key, { iv: key });
それを使用して単純な暗号化を行うと、C#メソッドとは異なる暗号化された値が得られるため、復号化が失敗すると思います。
私が見つけたものですが、対処方法がわからないのは、キーの値と復号化する値を渡すときに、それらが文字列である必要があるということですが、C# バージョンでは、CryptoStream はバイト配列を取るため、私がしなければならないことは何ですか?復号化する値を文字列として渡しますが、これが効果があるかどうかはわかりません。キーについても同じことがDESCryptoServiceProvider
言えます。 はキーと iv をバイト配列として受け入れますが、crypto-js 切り捨てられた配列を変換すると、バイト配列のリテラル テキストが変換されるだけです。現在、次を使用してその変換を試みています。
var key = trunc.toString(CryptoJS.enc.Utf8)
プロセスのステップを見逃していますか? 何か見逃していませんか?