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

2016-02-19 17:59 1 1 收藏

给自己一点时间接受自己,爱自己,趁着下午茶的时间来学习图老师推荐的在Java和.NET平台的加密术比较,过去的都会过去,迎接崭新的开始,释放更美好的自己。

【 tulaoshi.com - Web开发 】

  最近在写一个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;

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/webkaifa/)

      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);

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/webkaifa/)

      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

来源:https://www.tulaoshi.com/n/20160219/1616550.html

延伸阅读
标签: Java JAVA基础
使用Java语言编写应用程序最大的优点在于“一次编译,处处运行”,然而这并不是说所有的Java程序都具有跨平台的特性,事实上,相当一部分的Java程序是不能在别的操作系统上正确运行的,那么如何才能编写一个真正的跨平台的Java程序呢?下面是在编写跨平台的Java程序是需要注意的一些事情: 1.编写Java跨平台应用程序时,你...
标签: Web开发
Java Servlet及其特点 Servlet是Java技术对CGI编程的回答。Servlet程序在服务器端运行,动态地生成Web页面。与传统的CGI和许多其他类似CGI的技术相比,Java Servlet具有更高的效率,更容易使用,功能更强大,具有更好的可移植性,更节省投资(更重要的是, Servlet程序员收入要比Perl程序员高:-): 高效: 在传统的CGI中,每个请求都要启...
标签: SQLServer
SQL Server上内置了加密术用来保护各种类型的敏感数据。在很多时候,这个加密术对于你来说是完全透明的;当数据被存储时候被加密,它们被使用的时候就会自动加密。在其他的情况下,你可以选择数据是否要被加密。SQL Server可以加密下列这些组件: ·密码 ·存储过程,视图,触发器,用户自定义函数,默认值,和规则。 ·在服务器和用户之间...
概要 本文介绍了当前CRM系统的各种应用模式,指出了Java平台在实现CRM系统中具备的优势,并提出了“渐进式”实现CRM项目的原则。 展示窗:CRM系统的多种应用模式 !-- frame contents -- !-- /frame contents -- 无疑,作为一篇介绍“CRM系统”的文章的作者,我有责任展示这个缩略语所蕴藏的全部内涵。但由于各厂商的界...
导 读:在ADO中我们最常使用的对象就Recordset了,而在ADO.NET中又增加了一个对象DataSet。本文简要的对比了DateSet和Recordset的异同,这对ADO.NET的初学者非常有帮助! 翻译整理:.net技术网(www.51dotnet.com)郜飞 原文出处:http://www.database-applications.net/articles/dotnet4.html Recordset是一个连接或断开的(通过使用游标)...

经验教程

76

收藏

6
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部