国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

在Java和.NET平臺的加密術(shù)比較

2019-11-18 16:58:27
字體:
供稿:網(wǎng)友

最近在寫一個(gè)java的消息服務(wù)器,同時(shí)需要做一個(gè).NET版本的客戶端。他們之間需要安全通訊,基于一些簡單的密碼協(xié)議,用到公鑰加密、對稱加密、Hash算法。這個(gè)過程中,我對這兩個(gè)平臺的加密部分有了一定了解,以下也是我的一些新的認(rèn)識吧。

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加密的時(shí)候,需要一個(gè)密鑰的同時(shí),還需要初始化向量IV,這會使得初學(xué)入者使用起來不方便,這個(gè)問題到是十分容易對付的,修改一下配置就好了。
SymmetricAlgorithm algorithm = SymmetricAlgorithm.Create(algorithmName);
algorithm.Mode = CipherMode.ECB;
algorithm.Key = key;
algorithm.Padding = PaddingMode.PKCS7;通過這種設(shè)置之后,就能夠跟Java通訊操作,互為加密解密。

3) .NET 2.0和Java 1.5方面,加密算法的名字有些地方稍有差別。
AES <==> Rijndael
DESede <==> TripleDES
這是似乎是常識。


2、公鑰加密算法RSA
1) Java 1.5中,RSAPublicKey進(jìn)行g(shù)etEncoded()得到字節(jié)數(shù)組是ASN.1編碼的。逆轉(zhuǎn)回來需要使用X509EncodedKeySpec,這個(gè)細(xì)節(jié)需要閱讀文檔細(xì)節(jié)或者對密碼學(xué)有一定了解才知道。例如:
//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的公鑰加密部分,還是相當(dāng)易于使用的。風(fēng)格依然是功能簡單,傻瓜式使用,功能齊全。

Java中,支持ASN.1編碼,但是隱藏其中,使用者完全覺察不到。

2) .NET 2.0中,設(shè)計(jì)有些混亂,并不支持ASN.1編碼。但是Mono似乎在做ASN.1編碼的支持。為此我自己借鑒一個(gè)Java開元JCE的實(shí)現(xiàn),實(shí)現(xiàn)了一個(gè).NET版本的ASN Parser和ASN Builder,花了兩天時(shí)間。如下:
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的安全模塊設(shè)計(jì)得還是很好的,簡單易用,功能也齊全。
2) .NET 2.0則是有點(diǎn)亂,命名風(fēng)格和系統(tǒng)框架有些不協(xié)調(diào),功能欠缺,代碼組織的不夠理想。
3) 在Mono中,對安全的支持要比微軟已發(fā)布的要好,從網(wǎng)上可以看到,.NET Framework 2.0的一些特性也是從Mono中借鑒過來的。
4) 甚至可以認(rèn)為,.NET加密模塊的開發(fā)團(tuán)隊(duì)能力可能不是很強(qiáng)。就如那一句話“編寫糟糕的代碼并非我們的專利”。
http://www.survivalescaperooms.com/jobs/archive/2006/09/22/512297.html


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 大理市| 宁夏| 军事| 三江| 耒阳市| 绥化市| 肥乡县| 大厂| 会理县| 扎赉特旗| 孟津县| 潼关县| 呼伦贝尔市| 阳东县| 武威市| 栖霞市| 涞源县| 仪征市| 湘阴县| 沐川县| 观塘区| 永丰县| 崇仁县| 象山县| 霸州市| 铁岭县| 荥阳市| 东宁县| 竹溪县| 临夏市| 清苑县| 报价| 阳曲县| 乌兰浩特市| 丹棱县| 洪湖市| 宁夏| 石嘴山市| 贺兰县| 富源县| 都兰县|