程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 在Java和.NET平台的加密術比較

在Java和.NET平台的加密術比較

編輯:.NET實例教程

最近在寫一個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 DERN
ull()), 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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved