目前,我在C#/.NET中有这样的算法:
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 DES获得这个算法的结果,以匹配我的as3crypto的结果:
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);
}有谁有什么不同的建议吗?我遗漏了什么?蒂娅。
更新:
这是我现在使用的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:
“谢谢,”米格尔·桑切斯说。如果我将每一项数据分解并比较它们的输出,它们是相同的,除了最后一次加密:
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#/.NET的输出:
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());发布于 2016-10-12 14:12:10
首先更改这一行
inputBA.writeUTFBytes(decrKey);至
key.writeUTFBytes(decrKey);您可能需要一些像这样的函数才能在ByteArray中打印AS3。
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;
}https://stackoverflow.com/questions/39990689
复制相似问题