C#常用加密解密方法(RAS加密解密)

本文介绍了在C#开发中常用的一种加密解密方法——RSA算法,详细阐述了加密解密的基本概念,以及RSA算法的原理和优缺点。提供了RSA密钥生成、加密和解密的C#代码示例,帮助开发者理解和应用RSA加密技术。
摘要由CSDN通过智能技术生成

在日常开发过程中,总会遇到需要加密解密的需求,这里我整理了C#常用的加密解密方法分享给大家。

先看看加密的基本概念:

"加密",是一种限制对网络上传输数据的访问权的技术。原始数据(也称为明文,plaintext)被加密设备(硬件或软件)和密钥加密而产生的经过编码的数据称为密文(ciphertext)。将密文还原为原始明文的过程称为解密,它是加密的反向处理,但解密者必须利用相同类型的加密设备和密钥对密文进行解密。

加密的基本功能包括:

1. 防止不速之客查看机密的数据文件;

2. 防止机密数据被泄露或篡改;

3. 防止特权用户(如系统管理员)查看私人数据文件;

4. 使入侵者不能轻易地查找一个系统的文件。

一、本节摘要 

本节主要分享RAS加密解密:

        RSA公钥加密算法是1977年由Ron Rivest、Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的。RSA取名来自开发他们三者的名字。RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准。RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。

        RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价。即RSA的重大缺陷是无法从理论上把握它的保密性能如何,而且密码学界多数人士倾向于因子分解不是NPC问题。

RSA的缺点主要有:
A)产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密。
B)分组长度太大,为保证安全性,n 至少也要 600bits以上,使运算代价很高,尤其是速度较慢,较对称密码算法慢几个数量级;且随着大数分解技术的发展,这个长度还在增加,不利于数据格式的标准化。目前,SET(Secure Electronic Transaction)协议中要求CA采用2048bits长的密钥,其他实体使用1024比特的密钥。
C)RSA密钥长度随着保密级别提高,增加很快。下表列出了对同一安全级别所对应的密钥长度。

二、源码分享 

using System; 
using System.Text; 
using System.Security.Cryptography;
namespace Common
{ 
	/// <summary> 
	/// RSA加密解密及RSA签名和验证
	/// </summary> 
	public class RSACryption 
	{ 		
		public RSACryption() 
		{ 			
		} 

		#region RSA 的密钥产生 
	
		/// <summary>
		/// RSA 的密钥产生 产生私钥 和公钥 
		/// </summary>
		/// <param name="xmlKeys"></param>
		/// <param name="xmlPublicKey"></param>
		public void RSAKey(out string xmlKeys,out string xmlPublicKey) 
		{ 			
				System.Security.Cryptography.RSACryptoServiceProvider rsa=new RSACryptoServiceProvider(); 
				xmlKeys=rsa.ToXmlString(true); 
				xmlPublicKey = rsa.ToXmlString(false); 			
		} 
		#endregion 

		#region RSA的加密函数 
		//############################################################################## 
		//RSA 方式加密 
		//说明KEY必须是XML的行式,返回的是字符串 
		//在有一点需要说明!!该加密方式有 长度 限制的!! 
		//############################################################################## 

		//RSA的加密函数  string
		public string RSAEncrypt(string xmlPublicKey,string m_strEncryptString ) 
		{ 
			
			byte[] PlainTextBArray; 
			byte[] CypherTextBArray; 
			string Result; 
			RSACryptoServiceProvider rsa=new RSACryptoServiceProvider(); 
			rsa.FromXmlString(xmlPublicKey); 
			PlainTextBArray = (new UnicodeEncoding()).GetBytes(m_strEncryptString); 
			CypherTextBArray = rsa.Encrypt(PlainTextBArray, false); 
			Result=Convert.ToBase64String(CypherTextBArray); 
			return Result; 
			
		} 
		//RSA的加密函数 byte[]
		public string RSAEncrypt(string xmlPublicKey,byte[] EncryptString ) 
		{ 
			
			byte[] CypherTextBArray; 
			string Result; 
			RSACryptoServiceProvider rsa=new RSACryptoServiceProvider(); 
			rsa.FromXmlString(xmlPublicKey); 
			CypherTextBArray = rsa.Encrypt(EncryptString, false); 
			Result=Convert.ToBase64String(CypherTextBArray); 
			return Result; 
			
		} 
		#endregion 

		#region RSA的解密函数 
		//RSA的解密函数  string
		public string RSADecrypt(string xmlPrivateKey, string m_strDecryptString ) 
		{			
			byte[] PlainTextBArray; 
			byte[] DypherTextBArray; 
			string Result; 
			System.Security.Cryptography.RSACryptoServiceProvider rsa=new RSACryptoServiceProvider(); 
			rsa.FromXmlString(xmlPrivateKey); 
			PlainTextBArray =Convert.FromBase64String(m_strDecryptString); 
			DypherTextBArray=rsa.Decrypt(PlainTextBArray, false); 
			Result=(new UnicodeEncoding()).GetString(DypherTextBArray); 
			return Result; 
			
		} 

		//RSA的解密函数  byte
		public string RSADecrypt(string xmlPrivateKey, byte[] DecryptString ) 
		{			
			byte[] DypherTextBArray; 
			string Result; 
			System.Security.Cryptography.RSACryptoServiceProvider rsa=new RSACryptoServiceProvider(); 
			rsa.FromXmlString(xmlPrivateKey); 
			DypherTextBArray=rsa.Decrypt(DecryptString, false); 
			Result=(new UnicodeEncoding()).GetString(DypherTextBArray); 
			return Result; 
			
		} 
		#endregion 
	} 
} 

RAS加密解密算法是一种非对称加密算法,常用于数据加密和数字签名。以下是RAS加密解密算法的C语言实现示例: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #include <openssl/rsa.h> #include <openssl/pem.h> int main() { RSA *rsa = NULL; BIO *pubkeybio = NULL; BIO *prikeybio = NULL; unsigned char *msg = "Hello, world!"; unsigned char *encrypted = NULL; unsigned char *decrypted = NULL; int encryptedlen, decryptedlen; // 生成RSA密钥对 rsa = RSA_generate_key(2048, RSA_F4, NULL, NULL); if (rsa == NULL) { printf("RSA key generation failed!\n"); exit(EXIT_FAILURE); } // 生成公钥PEM文件 pubkeybio = BIO_new_file("public.pem", "w+"); if (pubkeybio == NULL) { printf("Unable to open public key file!\n"); exit(EXIT_FAILURE); } PEM_write_bio_RSAPublicKey(pubkeybio, rsa); BIO_free(pubkeybio); // 生成私钥PEM文件 prikeybio = BIO_new_file("private.pem", "w+"); if (prikeybio == NULL) { printf("Unable to open private key file!\n"); exit(EXIT_FAILURE); } PEM_write_bio_RSAPrivateKey(prikeybio, rsa, NULL, NULL, 0, NULL, NULL); BIO_free(prikeybio); // 加密 encrypted = (unsigned char *)malloc(RSA_size(rsa)); encryptedlen = RSA_public_encrypt(strlen(msg) + 1, msg, encrypted, rsa, RSA_PKCS1_PADDING); if (encryptedlen == -1) { printf("Encryption failed!\n"); exit(EXIT_FAILURE); } printf("Encrypted message: %s\n", encrypted); // 解密 decrypted = (unsigned char *)malloc(RSA_size(rsa)); decryptedlen = RSA_private_decrypt(encryptedlen, encrypted, decrypted, rsa, RSA_PKCS1_PADDING); if (decryptedlen == -1) { printf("Decryption failed!\n"); exit(EXIT_FAILURE); } printf("Decrypted message: %s\n", decrypted); RSA_free(rsa); free(encrypted); free(decrypted); return 0; } ``` 以上代码使用OpenSSL库实现了RSA密钥对的生成、公钥和私钥的输出、加密和解密操作。在实际使用中,需要根据具体需求进行修改和扩展。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MarcoPro

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值