分享
 
 
 

在Java和.NET平台的加密术比较

王朝java/jsp·作者佚名  2008-05-30
窄屏简体版  字體: |||超大  

最近在写一个Java的消息服务器,同时需要做一个.NET版本的客户端。他们之间需要安全通讯,基于一些简单的密码协议,用到公钥加密、对称加密、Hash算法。这个过程中,我对这两个平台的加密部分有了一定了解,以下也是我的一些新的认识吧。

1、对称加密

1) Java 1.5的对称加密很简单,提供的算法也较多。可以说是,使用简单,傻瓜式,而且功能齐全。

例如:

SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");

Cipher cipher = Cipher.getInstance("AES");

cipher.init(Cipher.DECRYPT_MODE, skeySpec);

byte[] decryptText = cipher.doFinal(data);

2) .NET 2.0的对称加密,缺省加密模式是CBC,CBC加密的时候,需要一个密钥的同时,还需要初始化向量IV,这会使得初学入者使用起来不方便,这个问题到是十分容易对付的,修改一下配置就好了。

SymmetricAlgorithm algorithm = SymmetricAlgorithm.Create(algorithmName);

algorithm.Mode = CipherMode.ECB;

algorithm.Key = key;

algorithm.Padding = PaddingMode.PKCS7;通过这种设置之后,就能够跟Java通讯操作,互为加密解密。

3) .NET 2.0和Java 1.5方面,加密算法的名字有些地方稍有差别。

AES <==> Rijndael

DESede <==> TripleDES

这是似乎是常识。

2、公钥加密算法RSA

1) Java 1.5中,RSAPublicKey进行getEncoded()得到字节数组是ASN.1编码的。逆转回来需要使用X509EncodedKeySpec,这个细节需要阅读文档细节或者对密码学有一定了解才知道。例如:

//public key ==> bytes

PublicKey publicKey =

byte[] rawPublicKey = publicKey.getEncoded();

// bytes ==> public key

X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(rawPublicKey);

KeyFactory keyFactory = KeyFactory.getInstance("RSA");

Key newPublicKey = keyFactory.generatePublic(x509KeySpec);

除此之外,Java的公钥加密部分,还是相当易于使用的。风格依然是功能简单,傻瓜式使用,功能齐全。

Java中,支持ASN.1编码,但是隐藏其中,使用者完全觉察不到。

2) .NET 2.0中,设计有些混乱,并不支持ASN.1编码。但是Mono似乎在做ASN.1编码的支持。为此我自己借鉴一个Java开元JCE的实现,实现了一个.NET版本的ASN Parser和ASN Builder,花了两天时间。如下:

public static RSAParameters ASN1ToPublicKey(byte[] rawPublicKey)

{

ASN1InputStream asnInput = new ASN1InputStream(rawPublicKey);

ASN1Sequence asnSeq = (ASN1Sequence)asnInput.ReadObject();

SubjectPublicKeyInfo subjectPublicKeyInfo = new SubjectPublicKeyInfo(asnSeq);

DERObjectIdentifier algOid = subjectPublicKeyInfo.AlgorithmId.ObjectId;

RSAPublicKeyStructure pubKey = new RSAPublicKeyStructure(

(ASN1Sequence)subjectPublicKeyInfo.PublicKey);

byte[] modulus = pubKey.Modulus;

byte[] publicExponent = pubKey.PublicExponent;

RSAParameters pram = new RSAParameters();

pram.Modulus = modulus;

pram.Exponent = publicExponent;

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();

rsa.ImportParameters(pram);

return pram;

}

public static byte[] PublicKeyToASN1(RSAParameters pram)

{

SubjectPublicKeyInfo info = new SubjectPublicKeyInfo(

new AlgorithmIdentifier(PKCSObjectIdentifiers.rsaEncryption,

new DERNull()), new RSAPublicKeyStructure(pram.Modulus, pram.Exponent).DERObject);

byte[] rawPublicKey = info.GetDEREncoded();

return rawPublicKey;

}

3、总体感觉

1) Java的安全模块设计得还是很好的,简单易用,功能也齐全。

2) .NET 2.0则是有点乱,命名风格和系统框架有些不协调,功能欠缺,代码组织的不够理想。

3) 在Mono中,对安全的支持要比微软已发布的要好,从网上可以看到,.NET Framework 2.0的一些特性也是从Mono中借鉴过来的。

4) 甚至可以认为,.NET加密模块的开发团队能力可能不是很强。就如那一句话“编写糟糕的代码并非我们的专利”。

http://www.cnblogs.com/jobs/archive/2006/09/22/512297.html

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有