C#简单的加密类实例
程序员文章站
2023-12-13 15:15:28
复制代码 代码如下:public static class encryptanddecrypt { &...
复制代码 代码如下:
public static class encryptanddecrypt
{
//加密
public static string encrypt(string input)
{
// 盐值
string saltvalue = "saltvalue";
// 密码值
string pwdvalue = "pwdvalue";
byte[] data = system.text.utf8encoding.utf8.getbytes(input);
byte[] salt = system.text.utf8encoding.utf8.getbytes(saltvalue);
// aesmanaged - 高级加密标准(aes) 对称算法的管理类
system.security.cryptography.aesmanaged aes = new system.security.cryptography.aesmanaged();
// rfc2898derivebytes - 通过使用基于 hmacsha1 的伪随机数生成器,实现基于密码的密钥派生功能 (pbkdf2 - 一种基于密码的密钥派生函数)
// 通过 密码 和 salt 派生密钥
system.security.cryptography.rfc2898derivebytes rfc = new system.security.cryptography.rfc2898derivebytes(pwdvalue, salt);
/**/
/*
* aesmanaged.blocksize - 加密操作的块大小(单位:bit)
* aesmanaged.legalblocksizes - 对称算法支持的块大小(单位:bit)
* aesmanaged.keysize - 对称算法的密钥大小(单位:bit)
* aesmanaged.legalkeysizes - 对称算法支持的密钥大小(单位:bit)
* aesmanaged.key - 对称算法的密钥
* aesmanaged.iv - 对称算法的密钥大小
* rfc2898derivebytes.getbytes(int 需要生成的伪随机密钥字节数) - 生成密钥
*/
aes.blocksize = aes.legalblocksizes[0].maxsize;
aes.keysize = aes.legalkeysizes[0].maxsize;
aes.key = rfc.getbytes(aes.keysize / 8);
aes.iv = rfc.getbytes(aes.blocksize / 8);
// 用当前的 key 属性和初始化向量 iv 创建对称加密器对象
system.security.cryptography.icryptotransform encrypttransform = aes.createencryptor();
// 加密后的输出流
system.io.memorystream encryptstream = new system.io.memorystream();
// 将加密后的目标流(encryptstream)与加密转换(encrypttransform)相连接
system.security.cryptography.cryptostream encryptor = new system.security.cryptography.cryptostream
(encryptstream, encrypttransform, system.security.cryptography.cryptostreammode.write);
// 将一个字节序列写入当前 cryptostream (完成加密的过程)
encryptor.write(data, 0, data.length);
encryptor.close();
// 将加密后所得到的流转换成字节数组,再用base64编码将其转换为字符串
string encryptedstring = convert.tobase64string(encryptstream.toarray());
return encryptedstring;
}
#region silverlight密码解密
/**/
/// <summary>
/// 解密数据
/// </summary>
/// <param name="input">加密后的字符串</param>
/// <returns>加密前的字符串</returns>
public static string decrypt(string input)
{
// 盐值(与加密时设置的值一致)
string saltvalue = "saltvalue";
// 密码值(与加密时设置的值一致)
string pwdvalue = "pwdvalue";
byte[] encryptbytes = convert.frombase64string(input);
byte[] salt = encoding.utf8.getbytes(saltvalue);
system.security.cryptography.aesmanaged aes = new system.security.cryptography.aesmanaged();
system.security.cryptography.rfc2898derivebytes rfc = new system.security.cryptography.rfc2898derivebytes(pwdvalue, salt);
aes.blocksize = aes.legalblocksizes[0].maxsize;
aes.keysize = aes.legalkeysizes[0].maxsize;
aes.key = rfc.getbytes(aes.keysize / 8);
aes.iv = rfc.getbytes(aes.blocksize / 8);
// 用当前的 key 属性和初始化向量 iv 创建对称解密器对象
system.security.cryptography.icryptotransform decrypttransform = aes.createdecryptor();
// 解密后的输出流
memorystream decryptstream = new memorystream();
// 将解密后的目标流(decryptstream)与解密转换(decrypttransform)相连接
system.security.cryptography.cryptostream decryptor = new system.security.cryptography.cryptostream(
decryptstream, decrypttransform, system.security.cryptography.cryptostreammode.write);
// 将一个字节序列写入当前 cryptostream (完成解密的过程)
decryptor.write(encryptbytes, 0, encryptbytes.length);
decryptor.close();
// 将解密后所得到的流转换为字符串
byte[] decryptbytes = decryptstream.toarray();
string decryptedstring = utf8encoding.utf8.getstring(decryptbytes, 0, decryptbytes.length);
return decryptedstring;
}
#endregion
}