C# DES 问题

最近要用到C#的DES算法,using System.Security.Cryptography; 

 

但是,找了网上很多的代码,createEncryptor的返回密文都是16位的,

 

即使设置

 

      _des = new DESCryptoServiceProvider();
                _des.Mode = CipherMode.ECB;
                _des.Padding = PaddingMode.Zeros;
                _des.KeySize = 64;
                _des.BlockSize = 64;
                _des.FeedbackSize = 64;

 

也没有用,不知道为什么

 

测试以后发现:

当只设置des.Mode的时候,输出密文长度是16字节

   DES des = new DESCryptoServiceProvider();
           des.Mode = CipherMode.ECB;

 

当设置  des.Padding = PaddingMode.Zeros; 或

  des.Padding = PaddingMode.None;

以后,输出密文长度是8字节

 

而当不设置 des.Padding 为以上两种模式时,即使设置了

 des.KeySize = 64;
              des.BlockSize = 64;
              des.FeedbackSize = 64;(传说中用来控制密文长度的属性)

仍然输出为16字节。

 

因此,若希望DES算法输出密文长度为8字节,就必须设置des.Padding = PaddingMode.Zeros; 或

des.Padding = PaddingMode.None; (推荐)

 

默认的PaddingMode是 PaddingMode.PKCS7. MSDN上找不到这个paddingmode的相关资料,

google上显示,该模式会给dataBlock"续尾",使得8字节的Block直接升级到16字节,从而直接导致输出密文也为16字节。

此时,设置FeedbackSize = 64 没用。

 

The PaddingMode.PKCS7 mode is more interesting. This padding mode fills out the last block of the message with a sequence of bytes, the value of each of which is equal to the total number of padding bytes. For instance, given a block size of 128 bits and a final block plain text value of [AA BB CC DD EE FF], the padding string would be "0A 0A 0A 0A 0A 0A 0A 0A 0A 0A". The 0A value indicates that there are 10 total padding bytes. The padded block would then look like so: [AA BB CC DD EE FF 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A].

 

即便如此,FeedbackSize 仍有误导之嫌。MSDN规定FeedbackSize不能大于blockSize,这就意味着 16字节的输入,输出密文可以是8字节。但是,我设置 des.FeedbackSize = 32 时,并没有出现 明文8字节,密文4字节(密文还是8字节)。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值