DES加密解密与AES加密解密

目录

[1]AES加密算法和DES加密算法的效率比较[2]AES和DES加密解密代码

随着开发时间的变长,当初认为比较难的东西,现在渐渐也就变的不那么难了!特别对于一些经常很少使用的类,时间长了之后渐渐就陌生了。所以在这里写一些日后可能会用到的加密与解密。

一.AES加密算法和DES加密算法的效率比较:

下面是在网上看到的一段关于“ES加密程序和一个AES加密程序,比较两个程序进行大文件加密的效率”:

  • 实验步骤:

  • 实验结果:

  • 结果分析:

当文件很小时,两个程序加密的时间差不多。但是当文件变大时,DES对文件的加密效率低于AES对文件的加密效率。可见AES具有比DES更好的安全性,效率!

二.AES和DES加密解密代码:

========DES加密========

/// <summary>
    ///  DES加密
    /// </summary>
    /// <param name="pToEncrypt">要加密的内容</param>
    /// <param name="sKey">密钥</param>
    /// <param name="StrMs">输出加密后的字符串</param>
    /// <returns>加密后的byte数组</returns>
    public static byte[] Encrypt(string pToEncrypt, string sKey, out string StrMs)
    {
        //访问数据加密标准(DES)算法的加密服务提供程序 (CSP) 版本的包装对象
        DESCryptoServiceProvider des = new DESCryptoServiceProvider();
        des.Mode = CipherMode.ECB;
        des.Padding = PaddingMode.PKCS7;
        des.Key = Encoding.UTF8.GetBytes(sKey); //建立加密对象的密钥和偏移量
        //des.IV = Encoding.UTF8.GetBytes(sKey);  // 如果是用ECB模式,则IV不管是什么都不会影响加密/解密的结果

        byte[] inputByteArray = Encoding.UTF8.GetBytes(pToEncrypt);//把字符串放到byte数组中

        MemoryStream ms = new MemoryStream();//创建其支持存储区为内存的流 
        CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);//定义将数据流链接到加密转换的流
        cs.Write(inputByteArray, 0, inputByteArray.Length);//上面已经完成了把加密后的结果放到内存中去
        cs.FlushFinalBlock();        

        StringBuilder ret = new StringBuilder();
        foreach (byte b in ms.ToArray())
        {
            ret.AppendFormat("{0:X2}", b);
        }
        StrMs = ret.ToString();
        return ms.ToArray();
    }

    /// <summary>
    /// DEs 解密过程
    /// </summary>
    /// <param name="pToDecrypt">被解密的字符串</param>
    /// <param name="sKey">密钥(只支持8个字节的密钥,同前面的加密密钥相同)</param>
    /// <returns>返回被解密的字符串</returns>
    public static string Decrypt(string pToDecrypt, string sKey)
    {
        DESCryptoServiceProvider des = new DESCryptoServiceProvider();
        des.Mode = CipherMode.ECB;
        des.Padding = PaddingMode.PKCS7;
        byte[] inputByteArray = new byte[pToDecrypt.Length / 2];
        for (int x = 0; x < pToDecrypt.Length / 2; x++)
        {
            int i = (Convert.ToInt32(pToDecrypt.Substring(x * 2, 2), 16));
            inputByteArray[x] = (byte)i;
        }

        des.Key = Encoding.UTF8.GetBytes(sKey); //建立加密对象的密钥和偏移量,此值重要,不能修改
        //des.IV = Encoding.UTF8.GetBytes(sKey);// 如果是用ECB模式,则IV不管是什么都不会影响加密/解密的结果
        MemoryStream ms = new MemoryStream();
        CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
        cs.Write(inputByteArray, 0, inputByteArray.Length);
        cs.FlushFinalBlock();

        return System.Text.Encoding.UTF8.GetString(ms.ToArray());
    }

/// <summary>
    /// AES加密
    /// </summary>
    /// <param name="toEncrypt">要加密的内容</param>
    /// <param name="strKey">密钥(16或者32位)</param>
    /// <returns>Base64转码后的密文</returns>
    public static string Encrypt(string toEncrypt, string strKey)
    {
        byte[] keyArray = UTF8Encoding.UTF8.GetBytes(strKey);
        byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt);

        RijndaelManaged rDel = new RijndaelManaged();//using System.Security.Cryptography;
        rDel.Key = keyArray;
        rDel.Mode = CipherMode.ECB;//using System.Security.Cryptography;
        rDel.Padding = PaddingMode.PKCS7;//using System.Security.Cryptography;    

        ICryptoTransform cTransform = rDel.CreateEncryptor();//using System.Security.Cryptography;
        byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

        return Convert.ToBase64String(resultArray, 0, resultArray.Length);
    }

    /// <summary>
    /// AES解密
    /// </summary>
    /// <param name="toDecrypt">要解密的内容</param>
    /// <param name="strKey">密钥(16或者32位)</param>
    /// <returns>解密后的明文</returns>
    public static string Decrypt(string toDecrypt, string strKey)
    {
        byte[] keyArray = UTF8Encoding.UTF8.GetBytes(strKey);
        byte[] toEncryptArray = Convert.FromBase64String(toDecrypt);

        RijndaelManaged rDel = new RijndaelManaged();
        rDel.Key = keyArray;
        rDel.Mode = CipherMode.ECB;
        rDel.Padding = PaddingMode.PKCS7;

        ICryptoTransform cTransform = rDel.CreateDecryptor();
        byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

        return UTF8Encoding.UTF8.GetString(resultArray);
    }
    #endregion AES解密
}

原文地址:https://www.cnblogs.com/tianqiang/p/11254491.html

时间: 2024-10-10 07:51:24

DES加密解密与AES加密解密的相关文章

MD5加密,Base64加密/解密,AES加密/解密

1.从github上下载GTMBase64-master和AESCrypt-ObjC-master导入工程,如下图所示. 2.使用前的配置及注意事项: (1) 在build phases中的GTMBase64.m需要设置 -fno-objc-arc (2) 在#import "NSString+Base64.m”文件中导入   #import <Foundation/Foundation.h> (3)在#import "GTMBase64.m”文件中添加         

【加密解密】-AES加密解密实现

先看实现效果,测试代码如下: package org.iti.algorithm; public class AESDemo { public static void main(String[] args) { // 明文 String mingWen = "zhuwenfei"; // 密钥 String pwd = "123"; // 明文加密得到的密文 String miWen = AESUtils.encrypt(pwd, mingWen); // 输出密文

Android 中 非对称(RSA)加密和对称(AES)加密

在非对称加密中使用的主要算法有:RSA.Elgamal.背包算法.Rabin.D-H.ECC(椭圆曲线加密算法)等. 优点: 非对称加密与对称加密相比,其安全性更好:对称加密的通信双方使用相同的秘钥,如果一方的秘钥遭泄露,那么整个通信就会被破解.而非对称加密使用一对秘钥,一个用来加密,一个用来解密,而且公钥是公开的,秘钥是自己保存的,不需要像对称加密那样在通信之前要先同步秘钥 比如: 做登陆功能的时候为了数据安全,需要对密码进行加密,这时候可以使用非对称加密, 首先通过后台提供的接口获取公钥,

前端加密传输 crypto-js AES 加密和解密

配置: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0&q

JNI调用c++实现AES加密解密

最近项目中用到数据加密解密的功能,由于Android.iOS以及服务器端都需要用到这个功能.而不同平台上加密出来的密文是不一样的,这样导致互相之间密文无法使用.于是决定使用C/C++完成加密解密,其他平台调用的方式进行处理. 加密解密实现 AES加密的具体实现过程本文暂不讨论,实现代码是直接从openssl源码中抽出来. 加密解密调用以下两个方法: int aes_encrypt(char * in, char* key, char * out) 加密//明文,密钥,密文 int aes_dec

python实现aes加密解密

引子: 在windows中python3使用  pycryptodemo 模块实现Aes加密解密.Aes加密有多种方式,自己可以上网了解下. AES是每16位一加密,并且保证key和vi都是16位的.废话不多说直接上代码. import base64 from Crypto.Cipher import AES from binascii import b2a_hex,a2b_hex class PrpCrypt(object): def __init__(self,key,iv): self.k

C# AES 加密

using System.Security.Cryptography; AES可以直接调用 好像只有ECB CBC CFB可以直接用,CTR OFB不知道怎么用 static class MyAES { static PaddingMode[] padding = { PaddingMode.PKCS7, PaddingMode.ANSIX923, PaddingMode.ISO10126, PaddingMode.None, PaddingMode.Zeros };//这是填充方式 stati

AES加密类

代码: using System; using System.IO; using System.Security.Cryptography; using System.Text; namespace Utils { /// <summary> /// AES加密解密 /// </summary> public class AES { #region 加密 #region 加密字符串 /// <summary> /// AES 加密(高级加密标准,是下一代的加密算法标准,

小程序登录的AES加密解释

前情回顾 通过wx.getUserInfo()的success回调得到的加密数据( encryptedData )对加密数据( encryptedData )解密后可得到openId和unionId. 如何解密,官方文档是这样解释的! 首次看到如上解密说明时,我只知道encryptedData和session_key获得方式. session_key在上篇有介绍,如下:获得session_key和openId(加解密.签名系列) 产生的疑问:1:AES是什么?2:128是什么?3:CBC是什么?