vs 2005中的加密无解密问题

http://access911.net/n/doc1.asp?mode=a&bid=005202&aid=4988810 

using System;
using System.Security.Cryptography ;
using System.Text;
using System.IO;


namespace SEDO
{
/// <summary>
/// SEDO 的摘要说明。
/// SEDO 实现的是用一个封装了4种对称加密方法(Des,Rc2,Rijndael,TripleDes)的组件
///
/// 注意事项:
/// 1:TripleDes和Rijndael加密/解密对象使用16或者24位byte的Key
/// 2:Rijndael只能使用16位的初始化向量IV
/// 3:Des和Rc2均使用8位Byte的Key和IV
/// 4:对需要加密/解密的数据流采用何种方法进行编码/解码,由调用组件的用户自己决定
/// 5:密钥和初始化向量IV由使用者自己定义
/// 程序员: 王海波 2003-05-19 hwnanghb@21cn.com
/// </summary>

//定义加密类型的枚举
public enum EncryptionAlgorithm {Des = 1, Rc2, Rijndael, TripleDes};


//定义加密类
internal class EncryptTransformer
{
private EncryptionAlgorithm algorithmID;
private byte[] initVec;
private byte[] encKey;

internal EncryptTransformer(EncryptionAlgorithm algId)
{
//Save the algorithm being used.
algorithmID = algId;
}

internal ICryptoTransform GetCryptoServiceProvider(byte[] bytesKey)
{
//当数据密钥Key或者初始化向量IV为空的时候,将使用加密对象自动产生的密钥Key或者初始化向量IV
switch (algorithmID)
{
case EncryptionAlgorithm.Des:
{
DES des = new DESCryptoServiceProvider();
des.Mode = CipherMode.CBC;

// See if a key was provided
if (null == bytesKey)
{
encKey = des.Key;
}
else
{
des.Key = bytesKey;
encKey = des.Key;
}
// See if the client provided an initialization vector
if (null == initVec)
{ // Have the algorithm create one
initVec = des.IV;
}
else
{ //No, give it to the algorithm
des.IV = initVec;
}
return des.CreateEncryptor();
}
case EncryptionAlgorithm.TripleDes:
{
TripleDES des3 = new TripleDESCryptoServiceProvider();
des3.Mode = CipherMode.CBC;
// See if a key was provided
if (null == bytesKey)
{
encKey = des3.Key;
}
else
{
des3.Key = bytesKey;
encKey = des3.Key;
}
// See if the client provided an IV
if (null == initVec)
{ //Yes, have the alg create one
initVec = des3.IV;
}
else
{ //No, give it to the alg.
des3.IV = initVec;
}
return des3.CreateEncryptor();
}
case EncryptionAlgorithm.Rc2:
{
RC2 rc2 = new RC2CryptoServiceProvider();
rc2.Mode = CipherMode.CBC;
// Test to see if a key was provided
if (null == bytesKey)
{
encKey = rc2.Key;
}
else
{
rc2.Key = bytesKey;
encKey = rc2.Key;
}
// See if the client provided an IV
if (null == initVec)
{ //Yes, have the alg create one
initVec = rc2.IV;
}
else
{ //No, give it to the alg.
rc2.IV = initVec;
}
return rc2.CreateEncryptor();
}
case EncryptionAlgorithm.Rijndael:
{
Rijndael rijndael = new RijndaelManaged();
rijndael.Mode = CipherMode.CBC;
// Test to see if a key was provided
if(null == bytesKey)
{
encKey = rijndael.Key;
}
else
{
rijndael.Key = bytesKey;
encKey = rijndael.Key;
}
// See if the client provided an IV
if(null == initVec)
{ //Yes, have the alg create one
initVec = rijndael.IV;
}
else
{ //No, give it to the alg.
rijndael.IV = initVec;
}
return rijndael.CreateEncryptor();
}
default:
{
throw new CryptographicException("Algorithm ID '" +
algorithmID +
"' not supported.");
}
}
}

 

 

md5加密

static   public   string   EncodePassword(string   strInput,   int   EncodeType)  
          {  
                  if   (EncodeType   ==   1)  
                          return   System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(strInput,   "md5");  
                  else  
                          return   System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(strInput,   "sha1");  
          }

  如果正确使用本软件可使其加密的文件无法破解。达到安全加密的效果。加密不可破解是从业者一直努力的方向,上世纪初曾经也出现过这样的应用,现在是计算机高速发展的时代,实现安全加密更容易了,实践证明用少量密钥(用户密码)去加密大量数据是不安全的,要想安全加密至少要为每一个被加密的信息配置一个密钥,这样使得密钥和原文件一样大,造成了密钥保存和分发的困难,该付出的成本必须付出,这里的解决办法是让密钥形成文件,使其安全的和原文件的密文放在一起,做到这一点就是对密钥文件或密文再次进行加密,注意现在密文和密钥文件都是乱码数据,对其加密方法得当是不可破解的,因为你不知道乱码文件的任何信息你是无法解密的,没有任何评判标准。这样的结果,实现安全加密的代价,1)占用空间大了一倍,2)操作复杂一些。这对于计算机速度越来越快,存储空间越来越便宜的现代应该是没有问题的。   这儿有两个加密程序,每个程序都可独立运行,它们的界面上都有各自的使用说明,都能完成对文件的加密,用户需要熟练的应用它们。这两个程序作用不相同,程序 1是以一字一密方式加密文件的,加密后除了生成密文另外还生成一个密钥文件。程序 2是用来给乱码文件加密的,程序2是采用随机置换的加密方式,对乱码数据的加密,即高效又快捷,你需要输入密码,具体用法看各程序在界面上的说明,加密都完成后,密文和乱码文件的密文,可以随便放到什么地方,任何人对这两个文件的攻击都将失败。解密时首先要解密程序2加密的文件,然后再利用密钥文件来解密密文。   程序1加密的文件为什么不能破解,道理很简单,程序1为每个原文件的字节生成一个字节的未知数,用这个未知数去加密源文件字节,从而生成一个密文字节,也就是           明密文字节 + 密钥字节 = 密文字节 如此可见一个方程两个未知数,是无解的。要解必须要有密钥字节。   我们看到,密文和密钥文件的密文都是乱码,如果不加密密钥文件你需要用安全的地方来保存密钥文件,但是如果有安全的地方保存文件你为何不直接保存原文件算了,何必多此一举,而加密后你只要记住密码就可以了。加密后的密钥文件是否安全?如果文件是乱码加密得当是无法破解的,如果用winrar和其它能报告你密码错误的加密软件是不安全的,本质上那类软件是出卖自己的。我们需要不检测结果正误的加密软件,这样才能做到不为窃密者提供信息,才能确保信息安全。破解者因为不知道任何评判标准而无法实施解密。   这里有三种选择,1)用程序2 加密密钥文件。2) 用程序2 加密密文。3)用程序2 加密密钥文件和密文。都是可以的,但用户必须自己清楚,解密时需按原路返回差一点都不行的。 【使用者须知】   基本功——首先找一些文件,用程序1和程序2分别进行加密解密试验,从单文件开始,到同时处理几个文件,练习到准确无误。   然后就可以练习下面的内容了:   练习一加密部分   用程序1加密文件A,得到A密文和A密钥文件(密钥文件的特征是扩展名最后是my),然后用程序2加密A的密钥文件,加密结束。注意对文件加密时,文件的名称并未改变,操作者自己要记清楚。   练习一解密部分    操作顺序一定要清楚,最后加密的要最先解密,首先用程序2解密加密的密钥文件,然后用程序1解密密文。   上述练习一是三种加密方式的第一种,读者可以尝试另外两种方式。   程序1是必不可少的,因为这有此种方法理论上是不可破解的这是其它软件做不到的,你可以不用程序2来加密密钥文件,而用随便一种性能不错,又不检测解密正误的程序来加密密钥文件等,同样可以安全加密。 如何挑选第三方软件   1)如果用此软件加密一个10M以上的单字符大文件,形成的密文能通过NIST检测,说明此软件性能不错。   2)解密时,如果密码输入错误,不报告错误。这个一试便知。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值