中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

DES&3DES算法原理及C#和JS實現的方法是什么

發布時間:2023-03-17 16:41:51 來源:億速云 閱讀:118 作者:iii 欄目:開發技術

這篇文章主要介紹“DES&3DES算法原理及C#和JS實現的方法是什么”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“DES&3DES算法原理及C#和JS實現的方法是什么”文章能幫助大家解決問題。

一、簡介

1、DES 簡介

DES 全稱為 Data Encryption Standard,即數據加密標準,是一種使用密鑰加密的塊算法,1977 年被美國聯邦政府的國家標準局確定為聯邦資料處理標準(FIPS),并授權在非密級政府通信中使用,隨后該算法在國際上廣泛流傳開來。

在很長時間內,許多人心目中“密碼生成”與 DES 一直是個同義詞。直到 1997 年 NIST(美國國家標準與技術研究院)開始公開征集更安全的加密算法以替代 DES,并在 2001 年推出了更加安全的 AES(Advanced Encryption Standard)高級加密標準。

優點:

  • Feistel 網絡的輪數可以任意增加;

  • 解密與輪函數 f 無關,輪函數f也不需要有逆函數;

  • 輪函數可以設計得足夠復雜;

  • 加密和解密可以使用完全相同的結構來實現。

缺點:

  • 分組比較短;

  • 密鑰太短;

  • 密碼生命周期短;

  • 運算速度較慢。

2、3DES 簡介

其實并不是直接由 DES 過渡到 AES,還有一個 3DES 統治時期。3DES 也稱 Triple DES,它使用 3 條 56 位的密鑰對數據進行三次加密。

3DES 算法通過對 DES 算法進行改進,增加 DES 的密鑰長度來避免類似的攻擊,針對每個數據塊進行三次 DES 加密;因此,3DES 加密算法并非什么新的加密算法,是 DES 的一個更安全的變形,它以 DES 為基本模塊,通過組合分組方法設計出分組加密算法。

相比 DES,3DES 因密鑰長度變長,安全性有所提高,但其處理速度不高。因此又出現了 AES 加密算法,AES 較于 3DES 速度更快、安全性也更高。

加密:

為了兼容普通的 DES,3DES 并沒有直接使用 加密->加密->加密 的方式,而是采用了 加密->解密->加密 的方式。

當三重密鑰均相同時,前兩步相互抵消,相當于僅實現了一次加密,因此可實現對普通 DES 加密算法的兼容。

解密:

3DES 解密過程,與加密過程相反,即逆序使用密鑰。是以密鑰 3、密鑰 2、密鑰 1的順序執行 解密->加密->解密。

二、C# 代碼實現

1、DES

// 測試(密鑰需要是八位字符)
string jiamihou = DesEncrypt("TestString", "11111222", false); // 57fe567eaa866373f851a526f07d9e26
string jiamiqian = DesDecrypt(jiamihou32, "11111222");
/// <summary>
/// DES加密字符串
/// </summary>
/// <param name="deseninstr">待加密的字符串</param>
/// <param name="deskey">加密密鑰,要求為8位</param>
/// <param name="isupper">返回大寫密文,false:小寫</param>
/// <returns>加密成功返回加密后的字符串,失敗返回源串</returns>
public static string DesEncrypt(string deseninstr, string deskey, bool isupper = true)
{
    StringBuilder stringBuilder = new StringBuilder();
    try
    {
        DESCryptoServiceProvider des = new DESCryptoServiceProvider();
        byte[] inputByteArray = Encoding.UTF8.GetBytes(deseninstr);
        des.Key = Encoding.UTF8.GetBytes(deskey);
        des.IV = Encoding.UTF8.GetBytes(deskey); // 當 mode 為 CBC 時,偏移量必傳
        des.Mode=CipherMode.ECB; // 為空默認 CBC
        MemoryStream memoryStream = new MemoryStream();
        CryptoStream cryptoStream = new CryptoStream(memoryStream, des.CreateEncryptor(), CryptoStreamMode.Write);
        cryptoStream.Write(inputByteArray, 0, inputByteArray.Length);
        cryptoStream.FlushFinalBlock();
        foreach (byte bb in memoryStream.ToArray())
        {
            stringBuilder.AppendFormat(isupper ? "{0:X2}" : "{0:x2}", bb);
        }
        return stringBuilder.ToString();
    }
    catch (Exception ex)
    {
        return deseninstr;
    }
}
/// <summary>
/// DES解密字符串
/// </summary>
/// <param name="desdeinstr">待解密的字符串</param>
/// <param name="deskey">解密密鑰,要求為8位</param>
/// <returns>解密成功返回解密后的字符串,失敗返源串</returns>
public static string DesDecrypt(string desdeinstr, string deskey)
{
    MemoryStream memoryStream = new MemoryStream();
    try
    {
        DESCryptoServiceProvider des = new DESCryptoServiceProvider();
        byte[] inputByteArray = new byte[desdeinstr.Length / 2];
        for (int ii = 0; ii < desdeinstr.Length / 2; ii++)
        {
            int intt = (Convert.ToInt32(desdeinstr.Substring(ii * 2, 2), 16));
            inputByteArray[ii] = (byte)intt;
        }
        des.Key = Encoding.UTF8.GetBytes(deskey);
        des.IV = Encoding.UTF8.GetBytes(deskey); // 當 mode 為 CBC 時,偏移量必傳
        des.Mode = CipherMode.ECB; // 為空默認 CBC
        CryptoStream cs = new CryptoStream(memoryStream, des.CreateDecryptor(), CryptoStreamMode.Write);
        cs.Write(inputByteArray, 0, inputByteArray.Length);
        cs.FlushFinalBlock();
        return Encoding.UTF8.GetString(memoryStream.ToArray());
    }
    catch
    {
        return desdeinstr;
    }
}

2、3DES

密文采用 Base64 格式輸出。

疑問解答:三次加解密操作會運用三個不同的 Key,但是我們只傳入了一個密鑰,怎么回事?

3DES 密鑰必須為 24 位,為 DES 的 3 倍,經測試得出結論:

TripleDESCryptoServiceProvider 內部將密鑰分成 3 份,進行了加密解密三重操作。

我們把 24 位字符串分成三部分,如果三部分均相等,或前兩部分相等,就會報錯:"Specified key is a known weak key for 'TripleDES' and cannot be used."--指定的密鑰是'TripleDES'的已知弱密鑰,不能使用。

// 測試
string jiamihou16 = SecurityDES.Des3Encrypt("TestString", "111112222233333444445555", "12345678"); // yJGf3qgWyoAQeaPY2S5Etg==
string jiamihou32 = SecurityDES.Des3Decrypt(jiamihou16, "111112222233333444445555", "12345678");
/// <summary>
/// 3DES 加密
/// </summary>
/// <param name="des3eninstr"></param>
/// <param name="des3key">24 位</param>
/// <param name="des3iv">8 位</param>
/// <returns></returns>
public static string Des3Encrypt(string des3eninstr, string des3key, string des3iv)
{
    string encryptPassword = string.Empty;
    SymmetricAlgorithm algorithm = new TripleDESCryptoServiceProvider();
    algorithm.Key = Encoding.UTF8.GetBytes(des3key);// Convert.FromBase64String(des3key);
    algorithm.IV = Encoding.UTF8.GetBytes(des3iv);
    algorithm.Mode = CipherMode.ECB;
    algorithm.Padding = PaddingMode.PKCS7;
    ICryptoTransform transform = algorithm.CreateEncryptor();
    byte[] data = Encoding.UTF8.GetBytes(des3eninstr);
    MemoryStream memoryStream = new MemoryStream();
    CryptoStream cryptoStream = new CryptoStream(memoryStream, transform, CryptoStreamMode.Write);
    cryptoStream.Write(data, 0, data.Length);
    cryptoStream.FlushFinalBlock();
    encryptPassword = Convert.ToBase64String(memoryStream.ToArray());
    memoryStream.Close();
    cryptoStream.Close();
    return encryptPassword;
}
/// <summary>
/// 3DES 解密
/// </summary>
/// <param name="des3deinstr">密文 Base64</param>
/// <param name="des3key">24 位</param>
/// <param name="des3iv">8 位</param>
/// <returns></returns>
public static string Des3Decrypt(string des3deinstr, string des3key, string des3iv)
{
    string decryptPassword = string.Empty;
    SymmetricAlgorithm algorithm = new TripleDESCryptoServiceProvider();
    algorithm.Key = Encoding.UTF8.GetBytes(des3key);
    algorithm.IV = Encoding.UTF8.GetBytes(des3iv);
    algorithm.Mode = CipherMode.ECB;
    algorithm.Padding = PaddingMode.PKCS7;
    ICryptoTransform transform = algorithm.CreateDecryptor(algorithm.Key, algorithm.IV);
    byte[] buffer = Convert.FromBase64String(des3deinstr);
    MemoryStream memoryStream = new MemoryStream(buffer);
    CryptoStream cryptoStream = new CryptoStream(memoryStream, transform, CryptoStreamMode.Read);
    StreamReader reader = new StreamReader(cryptoStream, System.Text.Encoding.ASCII);
    decryptPassword = reader.ReadToEnd();
    reader.Close();
    cryptoStream.Close();
    memoryStream.Close();
    return decryptPassword;
}

三、js 語言實現 

以下是通過 crypto-js.js 實現。

1、DES

注意:mode 為空默認 CBC,此時偏移量 iv 不可為空。

注意:密鑰可用位數為 8,如果超過 8 位以后的對加密結果無影響,且不會報錯。

// 先引入 js 文件
<script src="http://cdn.bootcdn.net/ajax/libs/crypto-js/4.0.0/crypto-js.js"></script>
// npm(Node.js package manager)方式
> npm install crypto-js
 
// 調用方法 message() 查看測試結果
function message(){
    var outdata_value = encryptByDES("TestString", "11111222");
    alert(outdata_value) // 57fe567eaa866373f851a526f07d9e26
    console.log("outdata_value-aes_encrypt:", outdata_value);
    outdata_value = decryptByDES(outdata_value, "11111222");
    alert(outdata_value)
    console.log("outdata_value-aes_decrypt:", outdata_value);
}
//DES 加密
function encryptByDES(deseninstr, keystr, ivstr = keystr) {
    var keybyte = CryptoJS.enc.Utf8.parse(keystr);
    var ivbyte = CryptoJS.enc.Utf8.parse(ivstr);
    let afterEncrypt = CryptoJS.DES.encrypt(deseninstr, keybyte, {
        iv: ivbyte, // 當 mode 為 CBC 時,偏移量必傳
        mode: CryptoJS.mode.ECB, // 為空默認 CBC
        padding: CryptoJS.pad.Pkcs7
    }).ciphertext.toString()
    console.log(afterEncrypt)
    return afterEncrypt
}
//DES 解密
function decryptByDES(desdeinstr, keystr, ivstr = keystr) {
    var keybyte = CryptoJS.enc.Utf8.parse(keystr);
    var ivbyte = CryptoJS.enc.Utf8.parse(ivstr);
    var decrypted = CryptoJS.DES.decrypt(
        { ciphertext: CryptoJS.enc.Hex.parse(desdeinstr) },
        keybyte,
        {
            iv: ivbyte, // 當 mode 為 CBC 時,偏移量必傳
            mode: CryptoJS.mode.ECB, // 為空默認 CBC
            padding: CryptoJS.pad.Pkcs7
        }
    );
    console.log(decrypted);
    var result_value = decrypted.toString(CryptoJS.enc.Utf8);
    return result_value;
}

2、3DES

// 調用方法 message() 查看測試結果
function message() {
    var outdata_value = encryptByDES("TestString", "111112222233333444445555");
    alert(outdata_value) // yJGf3qgWyoAQeaPY2S5Etg==
        console.log("outdata_value-3des_encrypt:", outdata_value);
    outdata_value = decryptByDES(outdata_value, "111112222233333444445555");
    alert(outdata_value)
        console.log("outdata_value-3des_decrypt:", outdata_value);
}
// 加密 密鑰需為 24 位,偏移量需為 8 位
function encryptByDES(deseninstr, keystr) {
    var keybyte = CryptoJS.enc.Utf8.parse(keystr);
    //var ivbyte = CryptoJS.enc.Utf8.parse(ivstr);
    var encrypted = CryptoJS.TripleDES.encrypt(deseninstr, keybyte, {
        // iv: ivbyte, // 當 mode 為 CBC 時,偏移量必傳
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Pkcs7
        });
    return encrypted.toString();
}
// 解密 密鑰需為 24 位,偏移量需為 8 位
function decryptByDES(desdeinstr, keystr) {
    var keybyte = CryptoJS.enc.Utf8.parse(keystr);
    //var ivbyte = CryptoJS.enc.Utf8.parse(ivstr);
    var decrypted = CryptoJS.TripleDES.decrypt(desdeinstr, keybyte, {
        // iv: ivbyte, // 當 mode 為 CBC 時,偏移量必傳
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Pkcs7
        });
    return decrypted.toString(CryptoJS.enc.Utf8);
}

關于“DES&3DES算法原理及C#和JS實現的方法是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

js
AI

池州市| 自贡市| 梁河县| 云林县| 抚顺县| 库伦旗| 淮北市| 图们市| 浠水县| 抚远县| 门源| 烟台市| 甘南县| 长白| 清流县| 永德县| 准格尔旗| 伊吾县| 肇东市| 翁源县| 绥江县| 平乡县| 柳林县| 林口县| 偏关县| 长海县| 布尔津县| 大丰市| 汤原县| 杨浦区| 西丰县| 左权县| 珲春市| 深泽县| 白银市| 楚雄市| 吉水县| 铁岭县| 玉溪市| 永泰县| 九寨沟县|