AES加密+解密

AES是一种对称加密算法(RSA、DSA、3DES), 信息的接收双方都需要事先知道秘钥和加密算法并且其密钥匙相同的,之后便是对数据进行加密。

非对称算法(RSA、DSA、ECC)是与之不同,发送双方A、B事先均声称一堆秘钥,然后A将自己的共有秘钥发给B,B将自己的共有秘钥发给A,如果A要给B发送消息,则先需要用B的公有秘钥进行加密,然后发送给B,此时B端再用自己的私有秘钥进行信息解密,B给A同样。

还有一种是线性散列算法(签名算法  MD5、SHA1、HMAC)生成一串不可逆的密文。

AES算法有着更高的速度和资源使用效率,安全级别也较高,称为下一代的加密标准。

AES 加密+解密

/// <summary>
        /// AES加密
        /// </summary>
        /// <param name="inputdata">输入的数据</param>
        /// <param name="iv">向量128位</param>
        /// <param name="strKey">加密密钥</param>
        /// <returns></returns>
        public static byte[] AESEncrypt(byte[] inputdata, byte[] iv, string strKey)
        {
            //分组加密算法   
            SymmetricAlgorithm des = Rijndael.Create();
            byte[] inputByteArray = inputdata;//得到需要加密的字节数组       
            //设置密钥及密钥向量
            des.Key = Encoding.UTF8.GetBytes(strKey.Substring(0, 32));
            des.IV = iv;
            using (MemoryStream ms = new MemoryStream())
            {
                using (CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write))
                {
                    cs.Write(inputByteArray, 0, inputByteArray.Length);
                    cs.FlushFinalBlock();
                    byte[] cipherBytes = ms.ToArray();//得到加密后的字节数组   
                    cs.Close();
                    ms.Close();                   
                    return cipherBytes;
                }
            }
        }

        /// <summary>
        /// AES解密
        /// </summary>
        /// <param name="inputdata">输入的数据</param>
        /// <param name="iv">向量128</param>
        /// <param name="strKey">key</param>
        /// <returns></returns>
        public static byte[] AESDecrypt(byte[] inputdata, byte[] iv, string strKey)
        {
            SymmetricAlgorithm des = Rijndael.Create();
            des.Key = Encoding.UTF8.GetBytes(strKey.Substring(0, 32));
            des.IV = iv;
            byte[] decryptBytes = new byte[inputdata.Length];
            using (MemoryStream ms = new MemoryStream(inputdata))
            {
                using (CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Read))
                {
                    cs.Read(decryptBytes, 0, decryptBytes.Length);
                    cs.Close();
                    ms.Close();
                }
            }
            return decryptBytes;
        }

对于各种加密算法的选用:

由于对称加密算法的密钥管理是一个复杂的过程,密钥的管理直接决定着他的安全性,因此当数据量很小时,我们可以考虑采用非对称加密算法。

在实际的操作过程中,我们通常采用的方式是:采用非对称加密算法管理对称算法的密钥,然后用对称加密算法加密数据,这样我们就集成了两类加密算法的优点,既实现了加密速度快的优点,又实现了安全方便管理密钥的优点。

如果在选定了加密算法后,那采用多少位的密钥呢?一般来说,密钥越长,运行的速度就越慢,应该根据的我们实际需要的安全级别来选择,一般来说,RSA建议采用1024位的数字,ECC建议采用160位,AES采用128为即可。



ps:

1、公钥加密体制用于保密性时,就是公钥加密,私钥解密。 因为公钥是可以公开了, 那么任何人都可以使用公钥对信息进行加密,但是只有持有私钥的人才能正确解密。这样就保证了信息的保密性,因为只有私钥持有者才能正确解密。
2、公钥加密体制用于认证性时,比如数字签名,即私钥持有者对信息进行签名,验证者可以根据公开的公钥进行验证签名是否正确和有效,即实现了认证性,以及不可抵赖性。


公钥加密私钥解密, 没问题,也可以说是"公共密钥加密系统"
私钥加密公钥解密,一般不这么说,应叫"私钥签名,公钥验证",也可以说是“公共密钥签名系统”

再来说一下"公共密钥签名系统"目的:(如果晕就多看几遍,这个没搞清,后面的代码就更晕)

A欲传(信息)给B,但又怕B不确信该信息是A发的。
1.A选计算(信息)的HASH值,如用MD5方式计算,得到:[MD5(信息)]
2.然后用自已的私钥加密HASH值,得到:[私钥(MD5(信息))]
3.最后将信息与密文一起传给B:传给B:[(信息) + 私钥(MD5(信息))]

B接到 :[(信息) + 私钥(MD5(信息))]
1.先用相同的HASH算法算出(信息)的HASH值,这里也使用MD5方式 
得到: [MD5(信息)!]
2. 再用A的公钥解密 [ 私钥(MD5(信息))]
   [公钥(私钥(MD5(信息)))] = [(MD5(信息)]
   如能解开,证明该 [ 私钥(MD5(信息))]是A发送的
3.再比效[MD5(信息)!]与[(MD5(信息)]
   如果相同,表示(信息)在传递过程中没有被他人修改过


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值