首页 >> 大全

RSA加解密简单实现

2023-10-17 大全 29 作者:考证青年

目录

浅谈加解密实现方式

MD5加密

DES加密

AES加密

RSA加密

SSL加密认证

关于RSA加解密实现

简单数据加解密的实现

分块加解密实现

附录

浅谈加解密实现方式

关于数据加解密方式,我们一般分为不可逆加密、对称可逆加密、非对称加密、综合加密应用等,简单介绍下我所了解的一些加密方式。

MD5加密

MD5加密属于不可逆加密,原文加密过后生成的密文无法解密出原文。

其特点包括:

rsa加解密的基本原理_rsa加解密实现程序_

一般使用场景包括:

DES加密

DES加密属于对称可逆加密,通信的双方使用同一个秘钥,通过秘钥加密过后的密文,可使用秘钥解密出原文。

其特点包括:

一般用于资讯传输数据的加密

AES加密

AES加密属于对称可逆加密,通信的双方使用同一个秘钥,通过秘钥加密过后的密文,可使用秘钥解密出原文。安全性高于DES加密

一般用于数据库加密存储隐私数据

其特点包括:

RSA加密

RSA属于非对称可逆加密,加密秘钥和解密秘钥为两个不同的秘钥,两个秘钥称之为公钥和私钥,公钥是公开的,通信双方都持有的,用来加密原文数据;私钥为通信的其中一方持有,用来解密数据来获取原文数据。

其特点包括:

一般用于网络数据传输,从而保证信息的保密性、认证性,比如数字签名,即私钥持有者对信息进行签名,验证者可以根据公开的公钥进行验证签名是否正确和有效,即实现了认证性,以及不可抵赖性。

SSL加密认证

SSL加密是数字证书加密,属于加解密综合应用,https协议使用(https协议=HTTP协议+SSL/TLS协议)

其证书构成为:

SSL加密模式可以用于发送安全电子邮件、访问安全站点、网上招标与投标、网上签约、网上订购、安全网上公文传送、网上办公、网上缴费、网上缴税以及网上购物等安全的网上电子交易活动,交易时,双方需要使用数字签名来表明自己的身份,并使用数字签名来进行有关的交易操作,防止交易过程中出现数据被泄露或篡改的情况

关于RSA加解密实现

使用RSA加解密的实现,需要引用..

简单数据加解密的实现

public void RSACheck(string txtValue){var rsaClient = new RSACryptoServiceProvider(2048);var privakeKeyByte = rsaClient.ExportRSAPrivateKey();var publicKeyByte = rsaClient.ExportRSAPublicKey();string privateKey = Convert.ToBase64String(privakeKeyByte); string publicKey= Convert.ToBase64String(publicKeyByte);int privateBytesRead = 0;RSACryptoServiceProvider rsaPrivate = new RSACryptoServiceProvider();rsaPrivate.ImportRSAPrivateKey(privakeKeyByte, out privateBytesRead);int publicBytesRead = 0;RSACryptoServiceProvider rsaPublic = new RSACryptoServiceProvider();rsaPublic.ImportRSAPublicKey(publicKeyByte, out publicBytesRead);Console.WriteLine("原始字符串:" + txtValue);//公钥加密string enStr = Convert.ToBase64String(rsaPublic.Encrypt(System.Text.Encoding.UTF8.GetBytes(txtValue), RSAEncryptionPadding.Pkcs1));Console.WriteLine("加密字符串:" + enStr);//私钥解密string deStr = System.Text.Encoding.UTF8.GetString(rsaPrivate.Decrypt(Convert.FromBase64String(enStr),RSAEncryptionPadding.Pkcs1));Console.WriteLine("解密字符串:" + deStr);私钥签名//string signStr = rsa.Sign(txtValue);//Console.WriteLine("字符串签名:" + signStr);公钥验证签名//bool signVerify = rsa.Verify(txtValue, signStr);//Console.WriteLine("验证签名:" + signVerify);}

实现效果

分块加解密实现

RSA加解密数据时,对于加解密的数据长度有一定的限制,其长度规则限制为

需要加密的字节数不能超过密钥的长度值除以 8 再减去 11(ider. / 8 - 11),而加密后得到密文的字节数,正好是密钥的长度值除以 8(即:ider. / 8)

因此对于加密/解密数据长度超过最大长度限制时,使用分块加密/解密的方式

分块加密实现

        /// /// 获取RSA私钥加密数据/// /// 加密公钥/// 加密原文数据/// public string GetRSAEncrypt(string publicKey,string txtValue){byte[] publicKeyByte = Convert.FromBase64String(publicKey);int publicBytesRead = 0;RSACryptoServiceProvider rsaPublic = new RSACryptoServiceProvider();rsaPublic.ImportRSAPublicKey(publicKeyByte, out publicBytesRead);int maxBlockSize = rsaPublic.KeySize / 8 - 11;//加密块最大长度限制//公钥加密string enStr = "";byte[] jsonByte = System.Text.Encoding.UTF8.GetBytes(txtValue);if (jsonByte.Length <= maxBlockSize){enStr = Convert.ToBase64String(rsaPublic.Encrypt(jsonByte, RSAEncryptionPadding.Pkcs1));}else{//待加密的字节数不能超过密钥的长度值除以 8 再减去 11(即:RSACryptoServiceProvider.KeySize / 8 - 11),//而加密后得到密文的字节数,正好是密钥的长度值除以 8(即:RSACryptoServiceProvider.KeySize / 8)。//加密数据长度超过最大长度限制时,使用分块加密的方式using (MemoryStream plaiStream = new MemoryStream(jsonByte))using (MemoryStream crypStream = new MemoryStream()){byte[] buffer = new byte[maxBlockSize];int blockSize = plaiStream.Read(buffer, 0, maxBlockSize);while (blockSize > 0){byte[] toEncrypt = new byte[blockSize];Array.Copy(buffer, 0, toEncrypt, 0, blockSize);byte[] cryptograph = rsaPublic.Encrypt(toEncrypt, RSAEncryptionPadding.Pkcs1);crypStream.Write(cryptograph, 0, cryptograph.Length);blockSize = plaiStream.Read(buffer, 0, maxBlockSize);}enStr = Convert.ToBase64String(crypStream.ToArray(), Base64FormattingOptions.None);}}return enStr;}

分块解密实现

        /// /// RSA解密/// /// 密文数据/// 解密私钥/// public string DeRsaData(string cipherText, string privateKey){string deStr = "";int bytesRead = 0;RSACryptoServiceProvider rsaPrivate = new RSACryptoServiceProvider();rsaPrivate.ImportRSAPrivateKey(Convert.FromBase64String(privateKey), out bytesRead);int maxBlockSize = rsaPrivate.KeySize / 8; //解密块最大长度限制byte[] ciphertextData = Convert.FromBase64String(cipherText);if (ciphertextData.Length <= maxBlockSize){deStr = System.Text.Encoding.UTF8.GetString(rsaPrivate.Decrypt(Convert.FromBase64String(cipherText), RSAEncryptionPadding.Pkcs1));}else{//需要解密的数据长度超过解密块最大长度时,使用分块解密using (MemoryStream crypStream = new MemoryStream(ciphertextData))using (MemoryStream plaiStream = new MemoryStream()){byte[] buffer = new byte[maxBlockSize];int blockSize = crypStream.Read(buffer, 0, maxBlockSize);while (blockSize > 0){byte[] toDecrypt = new byte[blockSize];Array.Copy(buffer, 0, toDecrypt, 0, blockSize);byte[] plaintext = rsaPrivate.Decrypt(toDecrypt, RSAEncryptionPadding.Pkcs1);plaiStream.Write(plaintext, 0, plaintext.Length);blockSize = crypStream.Read(buffer, 0, maxBlockSize);}deStr = System.Text.Encoding.UTF8.GetString(plaiStream.ToArray());}}return deStr;}

附录

关于..的使用学习ider 类 (..) | Learn

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了