編程生活

             :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            113 隨筆 :: 0 文章 :: 18 評論 :: 0 Trackbacks
          <2007年10月>
          30123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          留言簿(5)

          隨筆檔案

          搜索

          積分與排名

          最新評論

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

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

          1、對稱加密
          1) Java 1.5的對稱加密很簡單,提供的算法也較多??梢哉f是,使用簡單,傻瓜式,而且功能齊全。
          例如:
          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進行g(shù)etEncoded()得到字節(jié)數(shù)組是ASN.1編碼的。逆轉(zhuǎn)回來需要使用X509EncodedKeySpec,這個細節(jié)需要閱讀文檔細節(jié)或者對密碼學有一定了解才知道。例如:
          //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的實現(xiàn),實現(xiàn)了一個.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則是有點亂,命名風格和系統(tǒng)框架有些不協(xié)調(diào),功能欠缺,代碼組織的不夠理想。
          3) 在Mono中,對安全的支持要比微軟已發(fā)布的要好,從網(wǎng)上可以看到,.NET Framework 2.0的一些特性也是從Mono中借鑒過來的。
          4) 甚至可以認為,.NET加密模塊的開發(fā)團隊能力可能不是很強。就如那一句話“編寫糟糕的代碼并非我們的專利”。
          posted on 2007-10-21 17:57 wilesun 閱讀(265) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導航:
           
          主站蜘蛛池模板: 武冈市| 江西省| 项城市| 屯昌县| 定结县| 乾安县| 绿春县| 棋牌| 博爱县| 远安县| 土默特右旗| 麦盖提县| 太原市| 嘉祥县| 建宁县| 哈巴河县| 武邑县| 方正县| 花莲市| 临猗县| 博乐市| 军事| 普格县| 东方市| 含山县| 梨树县| 广水市| 嘉定区| 名山县| 乐清市| 贵南县| 彝良县| 前郭尔| 易门县| 沙雅县| 北安市| 铅山县| 罗甸县| 宣汉县| 鄂伦春自治旗| 胶南市|