您的位置:首页 > 编程语言 > C#

C#/.NET字符串加密和解密实现(AES和RSA代码举例)

2014-08-12 00:00 344 查看
在很多C#项目中,都需要实现对字符串的加密和解密,那么如何实现呢?现在对称密钥加密中最流行的就是AES加密法。
密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院 (NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。
在这里可以提供一个基于AES加密和解密的实现代码:
1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118
public

class

Crypto


{



private

static

byte

[] _salt = Encoding.ASCII.GetBytes(

"o6806642kbM7c5"

);



/// <summary>



/// Encrypt the given string using AES.  The string can be decrypted using



/// DecryptStringAES().  The sharedSecret parameters must match.



/// </summary>



/// <param name="plainText">The text to encrypt.</param>



/// <param name="sharedSecret">A password used to generate a key for encryption.</param>



public

static

string

EncryptStringAES(

string

plainText,

string

sharedSecret)



{



if

(

string

.IsNullOrEmpty(plainText))



throw

new

ArgumentNullException(

"plainText"

);



if

(

string

.IsNullOrEmpty(sharedSecret))



throw

new

ArgumentNullException(

"sharedSecret"

);



string

outStr =

null

;   

// Encrypted string to return



RijndaelManaged aesAlg =

null

;  

// RijndaelManaged object used to encrypt the data.



try



{



// generate the key from the shared secret and the salt



Rfc2898DeriveBytes key =

new

Rfc2898DeriveBytes(sharedSecret, _salt);



// Create a RijndaelManaged object



aesAlg =

new

RijndaelManaged();



aesAlg.Key = key.GetBytes(aesAlg.KeySize / 8);



// Create a decryptor to perform the stream transform.



ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);



// Create the streams used for encryption.



using

(MemoryStream msEncrypt =

new

MemoryStream())



{



// prepend the IV



msEncrypt.Write(BitConverter.GetBytes(aesAlg.IV.Length),0,

sizeof

(

int

));



msEncrypt.Write(aesAlg.IV, 0, aesAlg.IV.Length);



using

(CryptoStream csEncrypt =

new

CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))



{



using

(StreamWriter swEncrypt =

new

StreamWriter(csEncrypt))



{



//Write all data to the stream.



swEncrypt.Write(plainText);



}



}



outStr =Convert.ToBase64String(msEncrypt.ToArray());



}



}



finally



{



// Clear the RijndaelManaged object.



if

(aesAlg !=

null

)



aesAlg.Clear();



}



// Return the encrypted bytes from the memory stream.



return

outStr;



}



/// <summary>



/// Decrypt the given string.  Assumes the string was encrypted using



/// EncryptStringAES(),using an identical sharedSecret.



/// </summary>



/// <param name="cipherText">The text to decrypt.</param>



/// <param name="sharedSecret">A password used to generate a key for decryption.</param>



public

static

string

DecryptStringAES(

string

cipherText,

string

sharedSecret)



{



if

(

string

.IsNullOrEmpty(cipherText))



throw

new

ArgumentNullException(

"cipherText"

);



if

(

string

.IsNullOrEmpty(sharedSecret))



throw

new

ArgumentNullException(

"sharedSecret"

);



// Declare the RijndaelManaged object



// used to decrypt the data.



RijndaelManaged aesAlg =

null

;



// Declare the string used to hold



// the decrypted text.



string

plaintext =

null

;



try



{



// generate the key from the shared secret and the salt



Rfc2898DeriveBytes key =

new

Rfc2898DeriveBytes(sharedSecret, _salt);



// Create the streams used for decryption.  



byte

[] bytes = Convert.FromBase64String(cipherText);



using

(MemoryStream msDecrypt =

new

MemoryStream(bytes))



{



// Create a RijndaelManaged object



// with the specified key and IV.



aesAlg =

new

RijndaelManaged();



aesAlg.Key = key.GetBytes(aesAlg.KeySize / 8);



// Get the initialization vector from the encrypted stream



aesAlg.IV = ReadByteArray(msDecrypt);



// Create a decrytor to perform the stream transform.



ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);



using

(CryptoStream csDecrypt =

new

CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))



{



using

(StreamReader srDecrypt =

new

StreamReader(csDecrypt))



// Read the decrypted bytes from the decrypting stream



// and place them in a string.



plaintext =srDecrypt.ReadToEnd();



}



}



}



finally



{



// Clear the RijndaelManaged object.



if

(aesAlg !=

null

)



aesAlg.Clear();



}



return

plaintext;



}



private

static

byte

[] ReadByteArray(Stream s)



{



byte

[] rawLength =

new

byte

[

sizeof

(

int

)];



if

(s.Read(rawLength, 0, rawLength.Length) != rawLength.Length)



{



throw

new

SystemException(

"Stream did not contain properly formatted byte array"

);



}



byte

[] buffer =

new

byte

[BitConverter.ToInt32(rawLength, 0)];



if

(s.Read(buffer, 0, buffer.Length) != buffer.Length)



{



throw

new

SystemException(

"Did not read byte array properly"

);



}



return

buffer;



}


}

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

C#中实现RSA加密代码如下:
1

2

3

4

5

6
var

provider =

new

System.Security.Cryptography.RSACryptoServiceProvider();


provider.ImportParameters(your_rsa_key);


var

encryptedBytes = provider.Encrypt(



System.Text.Encoding.UTF8.GetBytes(

"Hello World!"

),

true

);


string

decryptedTest = System.Text.Encoding.UTF8.GetString(



provider.Decrypt(encryptedBytes,

true

));

转载请注明:文章转载自:[169IT-最新最全的IT资讯]
本文标题:C#/.NET字符串加密和解密实现(AES和RSA代码举例)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: