Java和.NET平台加密术比较

分类: asp.net   出处:iocblog整理  更新时间:2009-09-09   添加到收藏  

最近在写一个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
这是似乎是常识。

(文章来源 www.iocblog.net)
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;
}(文章来源 www.iocblog.net)

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


Tag: RSA



文章整理:iocblog
版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。