一个可逆加密的类(使用3DES加密)
程序员文章站
2023-08-17 11:05:41
一、提要 命名空间:system.security.cryptography.tripledes 类 简单说明: 表示三重数据加密标准算法的基类,tripledes 的所有...
一、提要
命名空间:system.security.cryptography.tripledes 类
简单说明: 表示三重数据加密标准算法的基类,tripledes 的所有实现都必须从此基类派生。是从 symmetricalgorithm 类里继承出来。tripledes 使用 des 算法的三次连续迭代。它可以使用两个或三个 56 位密钥。
使用目的:比较安全的加密一种方式,密钥和矢量的不同,会生产不同的加密字串。因为是des算法的三次连续迭代,而且算法可逆,这样对于数据保密性和可恢复性都不错。
二、代码示例
本代码参照了部分msdn上的代码示例,再根据自己的实际情况,补充了一部分msdn上没有提到的内容
using system;
using system.security;
using system.security.cryptography;
using system.io;
using system.text;
using system.threading;
namespace trip3des
{
/// <summary>
/// class1 的摘要说明。
/// </summary>
public class dllencrypt
{
//密钥
private const string skey = "qjzgeh6heszdvjecnfpguxzaib7nlqm3";
//矢量,矢量可以为空
private const string siv = "qcdy6x+aplw=";
//构造一个对称算法
private symmetricalgorithm mcsp = new tripledescryptoserviceprovider();
public dllencrypt(){}
#region public string encryptstring(string value)
/// <summary>
/// 加密字符串
/// </summary>
/// <param name="value">输入的字符串</param>
/// <returns>加密后的字符串</returns>
public string encryptstring(string value)
{
icryptotransform ct;
memorystream ms;
cryptostream cs;
byte[] byt;
mcsp.key = convert.frombase64string(skey);
mcsp.iv = convert.frombase64string(siv);
//指定加密的运算模式
mcsp.mode = system.security.cryptography.ciphermode.ecb;
//获取或设置加密算法的填充模式
mcsp.padding = system.security.cryptography.paddingmode.pkcs7;
ct = mcsp.createencryptor(mcsp.key, mcsp.iv);
byt = encoding.utf8.getbytes(value);
ms = new memorystream();
cs = new cryptostream(ms, ct, cryptostreammode.write);
cs.write(byt, 0, byt.length);
cs.flushfinalblock();
cs.close();
return convert.tobase64string(ms.toarray());
}
#endregion
#region public string decryptstring(string value)
/// <summary>
/// 解密字符串
/// </summary>
/// <param name="value">加过密的字符串</param>
/// <returns>解密后的字符串</returns>
public string decryptstring(string value)
{
icryptotransform ct;
memorystream ms;
cryptostream cs;
byte[] byt;
mcsp.key = convert.frombase64string(skey);
mcsp.iv = convert.frombase64string(siv);
mcsp.mode = system.security.cryptography.ciphermode.ecb;
mcsp.padding = system.security.cryptography.paddingmode.pkcs7;
ct = mcsp.createdecryptor(mcsp.key, mcsp.iv);
byt = convert.frombase64string(value);
ms = new memorystream();
cs = new cryptostream(ms, ct, cryptostreammode.write);
cs.write(byt, 0, byt.length);
cs.flushfinalblock();
cs.close();
return encoding.utf8.getstring(ms.toarray());
}
#endregion
}
}
三、总结
做成类库对于密钥和矢量的保管比较方便,输入输出全部是string型变量,这样也比较方便,密钥的生成可以用mscp. generatekey()来生成,矢量的生成也可以用mcsp.generateiv()来生成。大家也可以自己灵活的编写符合自己的3des算法。
命名空间:system.security.cryptography.tripledes 类
简单说明: 表示三重数据加密标准算法的基类,tripledes 的所有实现都必须从此基类派生。是从 symmetricalgorithm 类里继承出来。tripledes 使用 des 算法的三次连续迭代。它可以使用两个或三个 56 位密钥。
使用目的:比较安全的加密一种方式,密钥和矢量的不同,会生产不同的加密字串。因为是des算法的三次连续迭代,而且算法可逆,这样对于数据保密性和可恢复性都不错。
二、代码示例
本代码参照了部分msdn上的代码示例,再根据自己的实际情况,补充了一部分msdn上没有提到的内容
复制代码 代码如下:
using system;
using system.security;
using system.security.cryptography;
using system.io;
using system.text;
using system.threading;
namespace trip3des
{
/// <summary>
/// class1 的摘要说明。
/// </summary>
public class dllencrypt
{
//密钥
private const string skey = "qjzgeh6heszdvjecnfpguxzaib7nlqm3";
//矢量,矢量可以为空
private const string siv = "qcdy6x+aplw=";
//构造一个对称算法
private symmetricalgorithm mcsp = new tripledescryptoserviceprovider();
public dllencrypt(){}
#region public string encryptstring(string value)
/// <summary>
/// 加密字符串
/// </summary>
/// <param name="value">输入的字符串</param>
/// <returns>加密后的字符串</returns>
public string encryptstring(string value)
{
icryptotransform ct;
memorystream ms;
cryptostream cs;
byte[] byt;
mcsp.key = convert.frombase64string(skey);
mcsp.iv = convert.frombase64string(siv);
//指定加密的运算模式
mcsp.mode = system.security.cryptography.ciphermode.ecb;
//获取或设置加密算法的填充模式
mcsp.padding = system.security.cryptography.paddingmode.pkcs7;
ct = mcsp.createencryptor(mcsp.key, mcsp.iv);
byt = encoding.utf8.getbytes(value);
ms = new memorystream();
cs = new cryptostream(ms, ct, cryptostreammode.write);
cs.write(byt, 0, byt.length);
cs.flushfinalblock();
cs.close();
return convert.tobase64string(ms.toarray());
}
#endregion
#region public string decryptstring(string value)
/// <summary>
/// 解密字符串
/// </summary>
/// <param name="value">加过密的字符串</param>
/// <returns>解密后的字符串</returns>
public string decryptstring(string value)
{
icryptotransform ct;
memorystream ms;
cryptostream cs;
byte[] byt;
mcsp.key = convert.frombase64string(skey);
mcsp.iv = convert.frombase64string(siv);
mcsp.mode = system.security.cryptography.ciphermode.ecb;
mcsp.padding = system.security.cryptography.paddingmode.pkcs7;
ct = mcsp.createdecryptor(mcsp.key, mcsp.iv);
byt = convert.frombase64string(value);
ms = new memorystream();
cs = new cryptostream(ms, ct, cryptostreammode.write);
cs.write(byt, 0, byt.length);
cs.flushfinalblock();
cs.close();
return encoding.utf8.getstring(ms.toarray());
}
#endregion
}
}
三、总结
做成类库对于密钥和矢量的保管比较方便,输入输出全部是string型变量,这样也比较方便,密钥的生成可以用mscp. generatekey()来生成,矢量的生成也可以用mcsp.generateiv()来生成。大家也可以自己灵活的编写符合自己的3des算法。
上一篇: ES6小技巧之代替lodash
下一篇: PHP实现用户认证及管理完全源码