as3crypto加密与c# /. net不匹配
本文关键字:net 不匹配 加密 as3crypto | 更新日期: 2023-09-27 18:12:51
目前,我在c#/中有这个算法。净:
private static byte[] key = { };
private static readonly byte[] IV = { 20, 52, 88, 120, 76, 89, 205, 239 };
private static readonly string sEncryptionKey = "abcdefgh";
public static string Encrypt(string stringToEncrypt)
{
try
{
Debug.WriteLine("stringToEncrypt: " + stringToEncrypt);
key = System.Text.Encoding.UTF8.GetBytes(sEncryptionKey.Substring(0, 8));
Debug.WriteLine("key: " + Convert.ToBase64String(key));
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
//var des = new AesCryptoServiceProvider();
des.Padding = PaddingMode.Zeros;
byte[] inputByteArray = Encoding.UTF8.GetBytes(stringToEncrypt);
Debug.WriteLine("inputByteArray: " + Convert.ToBase64String(inputByteArray));
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(key, IV), CryptoStreamMode.Write);
Debug.WriteLine("IV: " + Convert.ToBase64String(IV));
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
Debug.WriteLine("Convert.ToBase64String(ms.ToArray()): " + Convert.ToBase64String(ms.ToArray()));
return Convert.ToBase64String(ms.ToArray());
}
catch (Exception e)
{
return e.Message;
}
}
问题是,我试图得到这个算法的结果,以匹配我的ActionScript使用as3crypto DES的结果:
protected function encrypt(input:String):String
{
var logData:Object = new Object();
var decrKey:String = new String("abcdefgh");
// byte[] IV = { 20, 52, 88, 120, 76, 89, 205, 239 };
var iv:ByteArray = new ByteArray();
iv.writeByte(20);
iv.writeByte(52);
iv.writeByte(88);
iv.writeByte(120);
iv.writeByte(76);
iv.writeByte(89);
iv.writeByte(205);
iv.writeByte(239);
iv.position = 0;
trace("iv: " + iv);
//var decrIV:String = iv.readUTF();
var decrIV:String = new String();
while (iv.bytesAvailable > 0) {
//read to letter or end of bytes
decrIV += iv.readUTFBytes(1);
}
var inputBA:ByteArray=Hex.toArray(Hex.fromString(input));
var key:ByteArray = Hex.toArray(Hex.fromString(decrKey));
var pad:IPad = new NullPad();
var aes:ICipher = Crypto.getCipher("des-cbc", key, pad);
pad.setBlockSize(aes.getBlockSize());
var ivmode:IVMode = des as IVMode;
ivmode.IV = Hex.toArray(Hex.fromString(decrIV));
des.encrypt(inputBA);
return Base64.encodeByteArray( inputBA);
}
谁有什么建议,为什么他们是不同的?我错过了什么?TIA。
更新:
这是我现在使用的ActionScript代码,但正如我的评论指出,它仍然不同于c#的结果:
protected function encrypt(input:String):String
{
var logData:Object = new Object();
var decrKey:String = new String("tuber$20");
// byte[] IV = { 20, 52, 88, 120, 76, 89, 205, 239 };
var iv:ByteArray = new ByteArray();
iv.writeByte(20);
iv.writeByte(52);
iv.writeByte(88);
iv.writeByte(120);
iv.writeByte(76);
iv.writeByte(89);
iv.writeByte(205);
iv.writeByte(239);
iv.position = 0;
trace("iv: " + iv);
//var decrIV:String = iv.readUTF();
var decrIV:String = new String();
while (iv.bytesAvailable > 0) {
//read to letter or end of bytes
decrIV += iv.readUTFBytes(1);
}
//var inputBA:ByteArray = Hex.toArray(Hex.fromString(input));
var inputBA:ByteArray = new ByteArray();
inputBA.writeUTFBytes(input);
//var key:ByteArray = Hex.toArray(Hex.fromString(decrKey));
var key:ByteArray = new ByteArray();
inputBA.writeUTFBytes(decrKey);
var pad:IPad = new NullPad();
var aes:ICipher = Crypto.getCipher("des-cbc", key, pad);
pad.setBlockSize(aes.getBlockSize());
var ivmode:IVMode = aes as IVMode;
//ivmode.IV = Hex.toArray(Hex.fromString(decrIV));
ivmode.IV = new ByteArray();
inputBA.writeUTFBytes(decrIV);
aes.encrypt(inputBA);
return Base64.encodeByteArray( inputBA);
}
更新2:谢谢你,@Miguel Sanchez。如果我将它们逐个分解并比较它们的输出,除了最后一个加密之外,它们是相同的:
protected function encrypt(input:String):String
{
trace("stringToEncrypt: " + input);
var logData:Object = new Object();
var decrKey:String = new String("tuber$20");
// byte[] IV = { 20, 52, 88, 120, 76, 89, 205, 239 };
var iv:ByteArray = new ByteArray();
iv.writeByte(20);
iv.writeByte(52);
iv.writeByte(88);
iv.writeByte(120);
iv.writeByte(76);
iv.writeByte(89);
iv.writeByte(205);
iv.writeByte(239);
iv.position = 0;
trace("iv: " + Base64.encodeByteArray(iv));
//var decrIV:String = iv.readUTF();
var decrIV:String = new String();
while (iv.bytesAvailable > 0) {
//read to letter or end of bytes
decrIV += iv.readUTFBytes(1);
}
trace("decrIV: " + decrIV);
//var inputBA:ByteArray = Hex.toArray(Hex.fromString(input));
var inputBA:ByteArray = new ByteArray();
inputBA.writeUTFBytes(input);
trace("inputBA: " + Base64.encodeByteArray(inputBA));
//var key:ByteArray = Hex.toArray(Hex.fromString(decrKey));
var key:ByteArray = new ByteArray();
key.writeUTFBytes(decrKey);
trace("key: " + Base64.encodeByteArray(key));
var pad:IPad = new NullPad();
var aes:ICipher = Crypto.getCipher("des-cbc", key, pad);
pad.setBlockSize(aes.getBlockSize());
var ivmode:IVMode = aes as IVMode;
//ivmode.IV = Hex.toArray(Hex.fromString(decrIV));
ivmode.IV = new ByteArray();
ivmode.IV.writeUTFBytes(decrIV);
trace("ivmode.IV: " + Base64.encodeByteArray(ivmode.IV));
aes.encrypt(inputBA);
trace("Base64.encodeByteArray(inputBA): " + Base64.encodeByteArray(inputBA));
return Base64.encodeByteArray(inputBA);
}
下面是ActionScript的输出:
stringToEncrypt: a1d63a1fb90b422ecce953b3302b6e521f96
key: dHViZXIkMjA=
inputBA: YTFkNjNhMWZiOTBiNDIyZWNjZTk1M2IzMzAyYjZlNTIxZjk2
iv: FDRYeExZze8=
decrIV: 4XxLYÍï
ivmode.IV: FDRYeExZw43Drw==
Base64.encodeByteArray(inputBA): 6AJu1PUFRHx+Ykf0r1HlZVy39kR0HrOaw+wTHmnRPPunisp4TR0cSw==
stringToEncrypt: 10:00
key: dHViZXIkMjA=
inputBA: MTA6MDA=
iv: FDRYeExZze8=
decrIV: 4XxLYÍï
ivmode.IV: FDRYeExZw43Drw==
Base64.encodeByteArray(inputBA): N5VgWd0Ccu0=
下面是c#/的输出。净:
stringToEncrypt: a1d63a1fb90b422ecce953b3302b6e521f96
key: dHViZXIkMjA=
inputByteArray: YTFkNjNhMWZiOTBiNDIyZWNjZTk1M2IzMzAyYjZlNTIxZjk2
IV: FDRYeExZze8=
Convert.ToBase64String(ms.ToArray()): h2jT8xR2SOPagrQwF3leuKFdEvHpYyfCUzEJw2lxXG2HnuUyw1QXzg==
stringToEncrypt: 10:00
key: dHViZXIkMjA=
inputByteArray: MTA6MDA=
IV: FDRYeExZze8=
Convert.ToBase64String(ms.ToArray()): WVOOknAikYs=
更新3:这是最后步骤的ActionScript代码:
aes.encrypt(inputBA);
return Base64.encodeByteArray(inputBA);
这是c#/。. NET代码的最后几步:
CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(key, IV), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
return Convert.ToBase64String(ms.ToArray());
首先修改这一行
inputBA.writeUTFBytes(decrKey);
key.writeUTFBytes(decrKey);
你可能需要一些像这样的函数来打印AS3
中的ByteArray
。
public static function fromArray(array:ByteArray, colons:Boolean=false):String {
var s:String = "";
for (var i:uint=0;i<array.length;i++) {
s+=("0"+array[i].toString(16)).substr(-2,2);
if (colons) {
if (i<array.length-1) s+=":";
}
}
return s;
}
来源:AS3 ByteArray到十六进制表示