簡體   English   中英

C#DES的CryptoJS解密加密文件失敗

[英]CryptoJS Decrypt Of C# DES Encrypted File Failing

我們有一個xml文件,該文件可跟蹤用戶在獨立培訓應用程序中完成課程的進度。 xml經過DES加密->轉換為base64字符串->通過以下c#代碼寫入文件

protected static byte[] key = new byte[] { 0x8c, 0x04, 0xD1, 0x1E, 0x14, 0xE2, 0x51, 0xDD };
protected static byte[] iv  = new byte[] { 0x96, 0xCF, 0x3A, 0x0D, 0x7D, 0x80, 0xDA, 0xA8 };
protected static int DefBlockSize = 64;

public static string Encrypt(string originalString)
{
    if (String.IsNullOrEmpty(originalString))
    {
        throw new ArgumentNullException("Cannot decrypt a null input string");
    }

    DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();
    cryptoProvider.BlockSize = DefBlockSize;
    MemoryStream memoryStream = new MemoryStream();
    CryptoStream cryptoStream = new CryptoStream(memoryStream, cryptoProvider.CreateEncryptor(key, iv), CryptoStreamMode.Write);
    StreamWriter writer = new StreamWriter(cryptoStream);
    writer.Write(originalString);
    writer.Flush();
    cryptoStream.FlushFinalBlock();
    writer.Flush();
    return Convert.ToBase64String(memoryStream.GetBuffer(), 0, (int) memoryStream.Length);
}

public static void EncryptToFile(string originalString, string filePath)    
{
    string base64String = DESEncryption.Encrypt(originalString);
    File.WriteAllBytes(filePath, Convert.FromBase64String(base64String));                                   
}

使用以下代碼在獨立的應用程序中解密工作正常:

protected override StreamReader LoadAsTextFile (string fileSystemPath)
{                   
    String base64EncryptedString = Convert.ToBase64String(File.ReadAllBytes(fileSystemPath));                               
    CryptoStream cs =  DESEncryption.DecryptToCryptoStream(base64EncryptedString);          
    StreamReader sr = new StreamReader(cs, true);
    return sr;
}
public static CryptoStream DecryptToCryptoStream(string base64EncryptedString)
{
    if (string.IsNullOrEmpty(base64EncryptedString))
    {
        throw new ArgumentNullException("Cannot decrypt a null input string");
    }

    DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();
    cryptoProvider.BlockSize = DefBlockSize;
    MemoryStream memoryStream = new MemoryStream(Convert.FromBase64String(base64EncryptedString));
    CryptoStream cryptoStream = new CryptoStream(memoryStream, cryptoProvider.CreateDecryptor(key, iv), CryptoStreamMode.Read);
    return cryptoStream;
}

作為一個更簡單的測試,我以這種格式對日期時間字符串“ 10/2/2014 10:54:25 AM”進行了加密。 加密后的base64字符串為P3Zj7NFQ8nUdM3FchVMxWEERB0oyOr4z 如果我在js / cryptojs中手動設置此base64字符串(請參見下文),則能夠成功解密js / cryptojs中原始的(c#)加密日期時間。

var base64 = "P3Zj7NFQ8nUdM3FchVMxWEERB0oyOr4z";
var utf8 = base64.toString(CryptoJS.enc.Utf8);  
var decrypted = CryptoJS.DES.decrypt(utf8, key, { iv: iv });                        
var decText = decrypted.toString(CryptoJS.enc.Utf8);
// decrypts correctly to 10/2/2014 10:54:25 AM

我只是似乎無法使用readAsArrayBuffer或readAsBinaryString從已保存的文件加載回數據。 如果我將readAsBinaryString與下面的js一起使用,則在讀取文件->轉換為base64后獲得的base64字符串與在保存文件之前在c#中看到的值略有不同。 (將javascript中的“ P3Zjw6zDkVDDsnUdM3FcwoVTMVhBEQdKMjrCvjM =“和c#中的“ P3Zj7NFQ8nUdM3FchVMxWEERB0oyOr4z”預先寫入文件)。

            if (window.File && window.FileReader && window.FileList && window.Blob) 
            {
                var r = new FileReader();
                var parser = new DOMParser();
                r.onload = function(e)
                {

                    var key = CryptoJS.enc.Hex.parse('8c04D11E14E251DD');
                    var iv  = CryptoJS.enc.Hex.parse('96CF3A0D7D80DAA8');       

                    var data = e.target.result;
                    var parsedWordArray = CryptoJS.enc.Utf8.parse(data);
                    var base64string = CryptoJS.enc.Base64.stringify(parsedWordArray);
                    var utf8 = base64string.toString(CryptoJS.enc.Utf8);    
                    var decrypted = CryptoJS.DES.decrypt(utf8, key, { iv: iv });                        
                    var decText = decrypted.toString(CryptoJS.enc.Utf8);
                    alert("Made it past decryption");                       
                }
                //r.readAsArrayBuffer(gXMLFile);    
                r.readAsBinaryString(gXMLFile);
            }

我在這里有同樣的問題。 我的密碼由Unity存儲,但是我必須使用JS讀取它們。 多虧了您的帖子,這使我感到振奮。 我終於得出了一些結果。

您確定Base64之后的“ 2014年10月2日10:54:25”將是“ P3Zj7NFQ8nUdM3FchVMxWEERB0oyOr4z”嗎? 我認為這是您的問題。

順便說一句,我使用此功能,它工作正常:

CryptoJS.decodePasswardForUnity = function (encryted, key = '71617A7365646366', iv = "1234567890abcdef") {
    let C = CryptoJS;
    encrytedBase64 = C.enc.Base64.parse(encryted);
    toDecrypt = C.enc.Hex.parse(encrytedBase64.toString());
    let res = C.DES.decrypt(C.lib.CipherParams.create({ ciphertext: toDecrypt }), C.enc.Hex.parse(key), { iv: C.enc.Hex.parse(iv), mode: C.mode.CBC});
    return C.enc.Utf8.stringify(C.enc.Hex.parse(res.toString()));
};

CryptoJS.encodePasswardAsUnity = function (password, key = '71617A7365646366', iv = "1234567890abcdef") {
    let C = CryptoJS;
    toEncode = C.enc.Hex.parse(C.enc.Utf8.parse(password).toString());
    let res = C.DES.encrypt(toEncode, C.enc.Hex.parse(key), { iv: C.enc.Hex.parse(iv), mode: C.mode.CBC}).ciphertext;
    return C.enc.Base64.stringify(res);
};

希望這可以幫到你

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM