DES对称加密Java和NET使用的区别节能
2020-10-30 合山装修公司
Java和.NET的系统类库里都有封装DES对称加密的实现方式,但是对外暴露的接口却各不相同,甚至有时会让自己难以解决其中的问题,比如Java加密后的结果在.NET中解密不出来等,由于最近项目有跨Java和.NET的加解密,经过我的分析调试,终于让它们可以互相加密解密了。
DES加密
DES是一种对称加密(Data Encryption Standard)算法,以前我写过一篇文章:.NET中加密解密相关知识,有过简单描述。
DES算法一般有两个关键点,第一个是加密算法,第二个是数据补位。
加密算法常见的有ECB模式和CBC模式:
ECB模式:电子密本方式,这是Java封装的DES算法的默认模式,就是将数据按照8个字节一段进行DES加密或解密得到一段8个字节的密文或者明文,最后一段不足8个字节,则补足8个字节(注意:这里就涉及到数据补位了)进行计算,之后按照顺序将计算所得的数据连在一起即可,各段数据之间互不影响。
CBC模式:密文分组链接方式,这是.NET封装的DES算法的默认模式,它比较麻烦,加密步骤如下:
1、首先将数据按照8个字节一组进行分组得到D1D2Dn(若数据不是8的整数倍,就涉及到数据补位了)
2、第一组数据D1与向量I异或后的结果进行DES加密得到第一组密文C1(注意:这里有向量I的说法,ECB模式下没有使用向量I)
3、第二组数据D2与第一组的加密结果C1异或以后的结果进行DES加密,得到第二组密文C2
4、之后的数据以此类推,得到Cn
5、按顺序连为C1C2C3Cn即为加密结果。
数据补位一般有NoPadding和PKCS7Padding(Java中是PKCS5Padding)填充方式,PKCS7Padding和PKCS5Padding实际只是协议不一样,根据相关资料说明:PKCS5Padding明确定义了加密块是8字节,PKCS7Padding加密快可以是之间。但是封装的DES算法默认都是8字节,所以可以认为他们一样。数据补位实际是在数据不满8字节的倍数,才补充到8字节的倍数的填充过程。
NoPadding填充方式:算法本身不填充,比如.NET的padding提供了有None,Zeros方式,分别为不填充和填充0的方式。
PKCS7Padding(PKCS5Padding)填充方式:为.NET和Java的默认填充方式,对加密数据字节长度对8取余为r,如r大于0,则补8-r个字节,字节为8-r的值;如果r等于0,则补8个字节8.比如:
加密字符串为为AAA,则补位为AAA55555;加密字符串为BBBBBB,则补位为BBBBBB22;加密字符串为CCCCCCCC,则补位为CCCCCCCC.
.NET中的DES加密
对于.NET,框架在yptography命名空间下提供了DESCryptoServiceProvider作为S加密解密的包装接口,它提供了如下的4个方法:
public override ICryptoTransform CreateDecryptor(byte[] rgbKey, byte[] rgbIV)
public override ICryptoTransform CreateEncryptor(byte[] rgbKey, byte[] rgbIV)
public override void GenerateIV()
public override void GenerateKey()[page]
从.NET类库封装情况,加解密需要传入一个Key和IV向量。而且Key必须为8字节的数据,否则会直接抛异常出来,当使用ECB模式下,不管传入什么IV向量,加密结果都一样。示例代码如下:
public static string EncryptWithJava(string key, string str)
{
if (ngth 8 || NullOrEmpty(str))
{
throw new Exception(加密key小于8或者加密字符串为空!);
}
byte[] bKey = tBytes(bstring(0, 8));
byte[] bIV = IV;
byte[] bStr = tBytes(str);
try
{
DESCryptoServiceProvider desc = new DESCryptoServiceProvider();
dding = CS7;//补位
de = B;//C
using (MemoryStream mStream = new MemoryStream())
{
using (CryptoStream cStream = new CryptoStream(mStream, eateEncryptor(bKey, bIV), ite))
{
ite(bStr, 0, ngth);
ushFinalBlock();
StringBuilder ret = new StringBuilder();
byte[] res = Array();
foreach (byte b in res)
这也证明了为什么凯勒是美国有史以来最重要的厨师。位列前十的还包括 Alinea(芝加哥)、Urasawa(比佛利山)、Saison(旧金山)、Manresa(加州洛斯加托斯)、Jean George(纽约)、Masa(纽约)、McCrady's(南卡罗来纳州查尔斯顿)和 Mini Bar/e by Jose Andres(华盛顿/拉斯维加斯)。{
pendFormat({0:x2}, b);
}
return String();
}
}
}
catch
{
return pty;
}
}[page]
由于为ECB模式,因此IV这里设置什么值都是可以的,当为CBC模式下,则需要设置为其他值,比如:public static byte[] IV = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 },才能正常加密解密。
Java中的DES加密
Java的pher包下,提供了加密解密的功能,它的静态getInstance方法,可以返回一个Cipher对象,一般有public static final Cipher getInstance(String transformation)方法,transformation为:algorithm/mode/padding,分别表示算法名称,比如DES,也可以在后面包含算法模式和填充方式,但也可以只是算法名称,如为:DES/CBC/PKCS5Padding,DES等。Java中默认的算法为ECB,默认填充方式为pher的Init方法用来初始化加密对象,常见的有:
public final void init(int opmode, Key key, AlgorithmParameterSpec params)
public final void init(int opmode,Key key, SecureRandom random)
用SecureRandom时,一般用于不需要IV的算法模式,示例代码如下:
public static String encrypt2(String src) throws Exception {
SecureRandom sr = new SecureRandom();
DESKeySpec ks = new DESKeySpec(tBytes(UTF-8));
SecretKeyFactory skf = tInstance(DES);
SecretKey sk = nerateSecret(ks);
Cipher cip = tInstance(DES/CBC/PKCS5Padding);//tInstance(DES);
IvParameterSpec iv2 = ne而是借产品建立品牌w IvParameterSpec(IV);
it(CRYPT_MODE, sk, iv2);//IV的方式
//it(CRYPT_MODE, sk, sr);//没有传递IV
String dest = byteToHex(Final(tBytes(UTF-8)));
return dest;
}
当默认用DES,Java会用ECB模式,因此这里IV向量没有作用,这里,但当用CBC模式下,如果还是用SecureRandom,则每次加密的结果都会不一样,因为Java内部会用随机的IV来初始化Cipher对象,如示例代码,由于tInstance(DES/CBC/PKCS5Padding)使用了CBC,因此我这里用的ParameterSpec包下的IvParameterSpec来初始化向量IV:
Private final static byte[] IV = new byte[] {0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01};
总结
对于.NET和Java在使用DES对称加密时,需要大家指定一样的算法和填充模式,并且Java在写DES加解密算法时,还需要根据创建Cipher对象的不同,正确使用IV向量。在不同系统需要互相数据时,必须要明确的是加密算法,Key和算法模式,再根据不同模式是否需要IV向量,最后是填充模式。
软肝片多少钱一盒一岁宝宝腹泻怎么办7个月宝宝拉肚子
-
-
艾弗森希望加入76人管理层威少大心脏最像搭配
艾弗森:希望加入76人管理层 威少大心脏最像我北京时间3月20日,据《csnphil...
- 软装搭配 2020-05-30
-
艾弗森希望加入76人管理层威少大心脏最像搭配
-
-
波溪丽亚湾浪漫之海自由之城搭配
波溪丽亚湾:浪漫之海 自由之城在阳光,沙滩,椰树,海浪编织的美妙画卷里...
- 软装搭配 2020-05-29
-
波溪丽亚湾浪漫之海自由之城搭配
-
-
佛罗伦萨vs拉齐奥分析佛罗伦萨前进势头遇搭配
佛罗伦萨vs拉齐奥分析 佛罗伦萨前进势头遇阻北京时间4月19日02:45分,意甲联...
- 软装搭配 2020-05-29
-
佛罗伦萨vs拉齐奥分析佛罗伦萨前进势头遇搭配
-
-
p强化木地板排名情况强化木地板价格p
强化木地板排名情况 强化木地板价格强化木地板因为有着高密度基材层,这...
- 软装搭配 2020-02-26
-
p强化木地板排名情况强化木地板价格p
-
-
p老房翻新装修注意事项旧房翻新后多久可以
老房翻新装修注意事项 旧房翻新后多久可以入住如今的房价是一个月变一个...
- 软装搭配 2020-02-21
-
p老房翻新装修注意事项旧房翻新后多久可以
-
-
p根据婚宴风格选择合适场地p
根据婚宴风格 选择合适场地根据婚宴风格 选择合适场地根据婚宴风格 选择合...
- 软装搭配 2020-02-20
-
p根据婚宴风格选择合适场地p