1
、
生成
key
和
IV
System.Security.Cryptography.
TripleDESCryptoServiceProvider类是dotnet中实现TripleDES算法的主要的类。
TripleDESCryptoServiceProvider类只有一个构造方法TripleDESCryptoServiceProvider(),这个方法把一些属性初始化:
KeySize(加密密钥长度,以位为单位)=
192(24字节)
BlockSize(加密处理的数据块大小,以位为单位)=
64(8字节)
FeedbackSize(加密数据块后返回的数据大小,以位为单位)= 64(8字节)
TripleDESCryptoServiceProvider构造方法同时会初始化一组随机的key和IV。
默认的TripleDESCryptoServiceProvider的key为24字节,IV为8字节,加密数据块为8字节。
生成key和IV的代码很简单:
TripleDESCryptoServiceProvider tDESalg
= new TripleDESCryptoServiceProvider();
byte[] keyArray = tDESalg.Key;
byte[] IVArray = tDESalg.IV;java的内部类与匿名类
生成的key和IV在加密过程和解密过程都要使用。
2
、
字符串明文转成某一代码页对应的编码字节流
待加密的数据可能有两种形式,一种是二进制的数据,本身就是一组字节流,这样的数据可以跳过这一步,直接进入加密步骤。
还有一种情况是字符串数据,字符串中同样的字符使用不同的代码页会生成不同的字节码,所以从字符串到字节流的转换是需要指定使用何种编码的。在解密之后,
要从字节流转换到字符串就要使用相同的代码页解码,否则就会出现乱码。
// 待加密的字符串ie8引起的上传异常问题
string plainTextString = "Here
is some data to encrypt. 这里是一些要加密的数据。";
// 使用utf-8编码(也可以使用其它的编码)
Encoding sEncoding
= Encoding.GetEncoding("utf-8");
// 把字符串明文转换成utf-8编码的字节流海运新闻
byte[] plainTextArray =
sEncoding.GetBytes(plainTextString);
3
、
加密操作
加密的原料是明文字节流,TripleDES算法对字节流进行加密,返回的是加密后的字节流。同时要给定加密使用的key和IV。
// 把字符串明文转换成utf-8编码的字节流
byte[] plainTextArray =
sEncoding.GetBytes(plainTextString);
public static byte[]
EncryptString(byte[] plainTextArray, byte[] Key, byte[] IV)
{
// 建立一个MemoryStream,这里面存放加密后的数据流
MemoryStream mStream
= new MemoryStream();
// 使用MemoryStream 和key、IV新建一个CryptoStream 对象
CryptoStream cStream
= new CryptoStream(mStream,
new TripleDESCryptoServiceProvider().CreateEncryptor(Key,
IV),
CryptoStreamMode.Write);
// 将加密后的字节流写入到MemoryStream
cStream.Write(plainTextArray,
0, plainTextArray.Length);
//把缓冲区中的最后状态更新到MemoryStream,并清除cStream的缓存区
cStream.FlushFinalBlock();
// 把解密后的数据流转成字节流
byte[] ret =
mStream.ToArray();
// 关闭两个streams.
cStream.Close();
mStream.Close();
return ret;
}
4
、
解密操作
解密操作解密上面步骤生成的密文byte[],需要使用到加密步骤使用的同一组Key和IV。
// 调用解密方法,返回已解密数据的byte[]
byte[] finalPlainTextArray =
DecryptTextFromMemory(Data, keyArray, IVArray);
public static byte[]
DecryptTextFromMemory(byte[] EncryptedDataArray, byte[] Key, byte[]
IV)
{
// 建立一个MemoryStream,这里面存放加密后的数据流
MemoryStream msDecrypt
= new MemoryStream(EncryptedDataArray);
// 使用MemoryStream 和key、IV新建一个CryptoStream 对象
CryptoStream csDecrypt
= new CryptoStream(msDecrypt,
new TripleDESCryptoServiceProvider().CreateDecryptor(Key,
IV),
CryptoStreamMode.Read);
// 根据密文byte[]的长度(可能比加密前的明文长),新建一个存放解密后明文的byte[]
byte[]
DecryptDataArray = new byte[EncryptedDataArray.Length];
// 把解密后的数据读入到DecryptDataArray
csDecrypt.Read(DecryptDataArray,
0, DecryptDataArray.Length);
msDecrypt.Close();
csDecrypt.Close();
return DecryptDataArray;
}
有一点需要注意,DES加密是以数据块为单位加密的,8个字节一个数据块,如果待加密明byte[]的长度不是8字节的
整数倍,算法先用值为“0”的byte补足8个字节,然后进行加密。所以加密后的密文长度一定是8的整数倍。这样的密文解密后如果补了0值的byte,则
解密后这些0值的byte依然存在。比如上例中要加密的明文是:
“Here is some
data to encrypt. 这里是一些要加密的数据。”
转成明文byte[]后是66个字节,DES算法就会补上6个0值的byte,补到72个字节。这样加密后再解密回来的密文byte[]解码后的字符串就是这样的:
"Here is some data to encrypt. 这里是一些要加密的数据。\0\0\0\0\0\0"
5
、
从编码字节流转成字符串明文
// 使用前面定义的Encoding,utf-8的编码把byte[]转成字符串
plainTextString =
sEncoding.GetString(finalPlainTextArray);
六、非对称加密之
RSA
加密和解密的讲解
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密钥长度随着保密级别提高,增加很
快。下表列出了对同一安全级别所对应的密钥长度。
保密级别
|
对称密钥长度(bit)
|
RSA密钥长度(bit)
|
ECC密钥长度(bit)
|
保密年限
|
80
|
80
|
1024
|
160
|
2010
|
112
|
112
|
2048
|
224
|
2030
|
128
|
128
|
3072
|
256
|
2040
|
192
|
192
|
7680
|
384
|
2080
|
256
|
256
|
15360
|
512
|
2120
|
这种算法1978年就出现了,它是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作,也很流行。算法的名字以发明者的名字命名:Ron Rivest, AdiShamir 和Leonard
Adleman。早在1973年,英国国家通信总局的数学家Clifford Cocks就发现了类似的算法。但是他的发现被列为绝密,直到1998年才公诸于世。
RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。
RSA的算法涉及三个参数,n、e1、e2。
其中,n是两个大质数p、q
的积,
n
的二进制表示时所占用的位数,就是所谓的密钥长度。
e1和e2是一对相关的值,e1可以任意取,但要求e1与(p-1)*(q-1)互质;再选择e2,要求(e2*e1)mod((p-1)*(q-1))=1。
(n及e1),(n及e2)就是密钥对。
RSA加解密的算法完全相同,设A为明文,B为密文,则:A=B^e1 mod n;B=A^e2 mod n;
e1和e2可以互换使用,即:
A=B^e2 mod n;B=A^e1 mod n;
分享到:
相关推荐
在C#编程中,数据加密和解密是确保信息安全的重要手段。通过加密,可以保护敏感信息免受未经授权的访问和篡改。本实例探讨了如何使用C#来实现数据加密,特别是针对文件中的机密数据。 首先,我们要了解C#中用于数据...
提供的"codefans.net"文件可能包含一个C#的加密解密示例项目,包括源代码和示例应用。通过下载并分析这些代码,你可以更深入地了解如何在C#环境中实现加密解密功能。 总之,理解并掌握C#中的加密解密技术对于任何...
这是C#的几种加密和解密的方法,里面包含Base64的加密和解密,MD5的加密,SHA1的加密和解密,文件夹的加密和解密
总结,C#中的RSA加密解密结合Winform界面,为用户提供了直观的操作方式来保护数据。开发者可以通过理解并运用这些概念,构建更复杂的安全系统,确保数据在传输和存储过程中的安全性。在实际项目中,还可以考虑使用...
总的来说,这个项目展示了如何在C#中使用`System.Numerics.BigInteger`实现RSA加密算法,同时提供了私钥加密和公钥解密的功能,确保了数据的安全性。为了实际应用,你需要理解并掌握RSA算法的原理,以及如何在.NET...
本教程主要讲解如何在C# .NET环境中使用RSA进行公钥加密和私钥解密,以及私钥加密和公钥解密的操作。 首先,让我们了解RSA的基本原理。RSA算法基于两个大素数的乘积,这个乘积作为公钥,而这两个大素数作为私钥。...
在C#编程语言中,加密和解密是安全领域中的重要概念,用于保护数据免受未经授权的访问。本文将深入探讨几种常见的加密和解密方法,包括Base64、MD5、SHA1以及文件夹的加密和解密。 首先,让我们从Base64加密和解密...
以下是对标题和描述中提及的10种C#加密解密方式的详细解释: 1. **MD5加密**:MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希函数,它将任意长度的数据转化为固定长度的摘要。虽然MD5已经不被认为安全用于...
C#加密和解密C#加密和解密C#加密和解密C#加密和解密
c# 和 c++ 通用加密解密 。有c#和c++的例子代码。亲测可用 c# 和 c++ 通用加密解密 。有c#和c++的例子代码。亲测可用 c# 和 c++ 通用加密解密 。有c#和c++的例子代码。亲测可用 c# 和 c++ 通用加密解密 。有c#和c++...
### C# 实现 AES 加密解密算法 #### 概述 在计算机科学与信息安全领域,数据加密技术是一项至关重要的技术。AES(Advanced Encryption Standard,高级加密标准)是一种广泛使用的对称加密算法,用于保护敏感数据的...
7. 数据安全:使用 jsencrypt 和 C# 对数据进行加密和解密,可以提高数据的安全性,防止数据在传输过程中被截获和篡改。 8. H5 应用:jsencrypt 和 C# 可以应用于 H5 应用中,以提高数据的安全性。例如,在投票提交...
在C#编程环境中,处理XML文件的加密和解密是一项重要的任务,特别是在处理敏感数据时。XML文件因为其结构清晰、易于解析而被广泛应用,但同时也需要妥善保护以防止未授权访问。以下是对C#中XML文件加密和解密的详细...
总的来说,C#和Java之间的RSA加密解密通信涉及到多方面的知识,包括非对称加密原理、公钥私钥的生成和管理、不同编程语言间的互操作、数据安全传输以及可能的错误处理策略。掌握这些知识对于开发跨平台、高安全性的...
带加密字符的 加密 解密方法 static string encryptKey = "加密... 自定义加密字符(加密解密必须一致才能解密) /// /// 加密字符串 /// /// name="str">要加密的字符串 /// 加密后的字符串
通过这个例子,开发者可以了解如何在C#中使用RAS算法进行数据的加密和解密。在实际应用中,你可能需要考虑更多安全因素,比如密钥的存储和保护,以及错误处理等。同时,确保遵循最佳实践,以保证系统的安全性。
例如,`ZYBEncrypt.csproj`和`ZYBEncrypt.sln`是项目文件,可能包含了整个加密解密库的构建和解决方案信息。开发者可以通过这些源代码学习和理解如何在C#中实际应用这些加密算法,或者直接在自己的项目中复用这些...
MD5 单向加密 SHA1 单向加密 DES 双向,可解密 加密字符串 ...RSA加密解密及RSA签名和验证 RSA 的密钥产生 产生私钥 和公钥 RSA 方式加密 RSA的解密函数 获取Hash描述表 RSA签名 RSA 签名验证
C#-自定义手机号加密和解密算法