??xml version="1.0" encoding="utf-8" standalone="yes"?>秋霞av国产精品一区,日本免费一区二区三区最新,亚洲日本欧美中文幕http://www.aygfsteel.com/onejavaer/category/46182.html让我在热血沸腾中度此一?让我在醇酒般的梦里醉沉Q莫使我Dq惔塑的肉nQ终以空虚的w壳毁于泥尘zh-cnTue, 31 Aug 2010 15:29:37 GMTTue, 31 Aug 2010 15:29:37 GMT60利用DES加密法保护Java源代?http://www.aygfsteel.com/onejavaer/archive/2006/11/04/79081.html暗夜_暗夜_Sat, 04 Nov 2006 08:59:00 GMThttp://www.aygfsteel.com/onejavaer/archive/2006/11/04/79081.htmlhttp://www.aygfsteel.com/onejavaer/comments/79081.htmlhttp://www.aygfsteel.com/onejavaer/archive/2006/11/04/79081.html#Feedback1http://www.aygfsteel.com/onejavaer/comments/commentRss/79081.htmlhttp://www.aygfsteel.com/onejavaer/services/trackbacks/79081.html 作者:李琴 李家?#160;  出处Q计机与信息技?/span>

 ??/strong>Q本文首先分析了Java源代码需要加密的原因Q简要介l了DES法及Java密码体系和Java密码扩展Q最后说明了利用DES加密法保护Java源代码的Ҏ及步骤?br />
  关键?/strong> Java 加密 DES法

  Java语言是一U非帔R用?a class="bluekey" target="_blank">|络~程的语aQ它的基本结构与C++极ؓ怼Q但抛弃?a class="bluekey" target="_blank">C/C++中指针等内容Q同时它吸收了Smalltalk、C++面向对象的编E思想。它h单性、鲁性、可UL性、动态性等特点。这些特点得Java成ؓ跨^台应用开发的一U规范,在世界范围内q泛传?br />
  加密Java源码的原?/strong>

  Java源代码经q编译以后在JVM中执行。由于JVM界面是完全透明的,Javac?/font>文g能够很容易通过反编?/font>器重新{换成源代码。因此,所有的法、类文g{都可以以源代码的Ş式被公开Q得Y件不能受C护,Z保护产权Q一般可以有以下几种ҎQ?br />
  Q?Q?模糊"cLӞ加大?a class="bluekey" target="_blank">~译?/font>反编译源代码文g的难度。然而,可以修改反编译器Q之能够处理这些模p类文g。所以仅仅依?模糊cL?来保证代码的安全是不够的?br />
  Q?Q流行的加密工具?a class="bluekey" target="_blank">源文?/font>q行加密Q比?a class="bluekey" target="_blank">PGPQ?a class="bluekey" target="_blank">Pretty Good PrivacyQ或GPGQ?a class="bluekey" target="_blank">GNU Privacy GuardQ。这Ӟ最l用户在q行应用之前必须先进?a class="bluekey" target="_blank">解密。但解密之后Q最l用户就有了一份不加密的类文gQ这和事先不q行加密没有什么差别?br />
  Q?Q加密类文gQ在q行中JVM用定制的c装载器QClass LoaderQ解密类文g。Javaq行时装入字节码的机刉含地意味着可以对字节码q行修改。JVM每次装入cL件时都需要一个称为ClassLoader的对象,q个对象负责把新的类装入正在q行的JVM。JVMlClassLoader一个包含了待装入类Q例如java.lang.ObjectQ名字的字符Ԍ然后由ClassLoader负责扑ֈcLӞ装入原始数据Qƈ把它转换成一个Class对象?br />
  用户下蝲的是加密q的cLӞ在加密类文g装入之时q行解密Q因此可以看成是一U即时解密器。由于解密后的字节码文g永远不会保存?a class="bluekey" target="_blank">文gpȝQ所?a class="bluekey" target="_blank">H密者很隑־到解密后的代码?

  ׃把原始字节码转换成Class对象的过E完全由pȝ负责Q所以创建定制ClassLoader对象其实q不困难Q只需先获得原始数据,接着可以进行包含解密在内的M转换?br />
  Java密码体系和Java密码扩展

  Java密码体系(JCA)和Java密码扩展(JCE)的设计目的是为Java提供与实现无关的加密函数API。它们都用factoryҎ来创建类的例E,然后把实际的加密函数委托l提供者指定的底层引擎,引擎中ؓcL供了服务提供者接口在Java中实现数据的加密/解密Q是使用其内|的JCE(Java加密扩展)来实现的?a class="bluekey" target="_blank">Java开?/font>工具?.1为实现包?a class="bluekey" target="_blank">数字{֐和信息摘要在内的加密功能Q推Z一U基于供应商的新型灵zd用编E接口。Java密码体系l构支持供应商的互操?同时支持g和Y件实现?br />
  Java密码?a class="bluekey" target="_blank">l构设计遵@两个原则:

  (1)法的独立性和可靠性?br />
  (2)实现的独立性和怺作用性?br />
  法的独立性是通过定义密码服务cL获得。用户只需了解密码法的概?而不用去兛_如何实现q些概念。实现的独立性和怺作用性通过密码服务提供器来实现。密码服务提供器是实C个或多个密码服务的一个或多个E序包。Y件开发商Ҏ一定接?各U算法实现后,打包成一个提供器,用户可以安装不同的提供器。安装和配置提供?可将包含提供器的ZIP?a class="bluekey" target="_blank">JAR文g攑֜CLASSPATH?再编辑Java安全属性文件来讄定义一个提供器。Javaq行环境Sun版本? 提供一个缺省的提供器Sun?br />
  下面介绍DES法及如何利用DES法加密和解?/font>cL件的步骤?br />
  DES法?/strong>

  DESQ?a class="bluekey" target="_blank">Data Encryption StandardQ是发明最早的最q泛使用的分l对U加密算法。DES法的入口参数有三个Q?a class="bluekey" target="_blank">Key?a class="bluekey" target="_blank">Data、Mode。其?a class="bluekey" target="_blank">Key?个字节共64位,是DES法的工作密钥;Data也ؓ8个字?4位,是要被加密或被解密的数据QMode为DES的工作方式,有两U:加密或解密?br />
  DES法工作程如下Q若Mode为加密模式,则利用Key Ҏ据Dataq行加密Q?生成Data的密码Ş式(64位)作ؓDES的输出结果;如Mode密模式,则利用Key对密码Ş式的数据Dataq行解密Q还原ؓData的明码Ş式(64位)作ؓDES的输出结果。在通信|?/font>l的两端Q双方约定一致的KeyQ在通信的源点用KeyҎ心数据进行DES加密Q然后以密码形式在公共通信|(?a class="bluekey" target="_blank">电话|?/font>Q中传输?a class="bluekey" target="_blank">通信|络的终点,数据到达目的地后Q用同样的Key对密码数据进行解密,便再C明码形式的核心数据。这P便保证了核心数据在公共通信|中传输的安全性和可靠性?br />
  也可以通过定期在通信|络的源端和目的端同时改用新的KeyQ便能更q一步提高数据的保密性?br />利用DES法加密的步?br />
  Q?Q生成一个安全密钥。在加密或解密Q何数据之前需要有一个密钥。密钥是随同被加密的应用E序一起发布的一D|据,密钥代码如下所C?br />
  【生成一个密钥代码?br />

//  生成一个可信Q的随机数?/span>
Secure Random sr  =   new  SecureRandom();
//  为我们选择的DES法生成一个KeyGenerator对象
KeyGenerator kg  =  KeyGenerator.getInstance ( " DES "  );
Kg.init (sr);
//  生成密钥
Secret Key key  =  kg.generateKey();
//  密钥数据保存ؓ文g供以后用,其中key FilenameZ存的文g?/span>
Util.writeFile (key Filename, key.getEncoded () );

2Q加密数据。得到密钥之后,接下来就可以用它加密数据。如下所C?br />
  【用密钥加密原始数据?br />
// 产生一个可信Q的随机数?/span>
SecureRandom sr = new SecureRandom();
//从密钥文件key Filename中得到密钥数?/span>
Byte rawKeyData [] = Util.readFile (key Filename);
// 从原始密钥数据创建DESKeySpec对象
DESKeySpec dks = new DESKeySpec (rawKeyData);
// 创徏一个密钥工厂,然后用它把DESKeySpec转换成Secret Key对象
SecretKeyFactory key Factory = SecretKeyFactory.getInstance("DES" );
Secret Key key 
= keyFactory.generateSecret( dks );
// Cipher对象实际完成加密操作
Cipher cipher = Cipher.getInstance( "DES" );
// 用密钥初始化Cipher对象
cipher.init( Cipher.ENCRYPT_MODE, key, sr );
// 通过ȝ文g获取需要加密的数据
Byte data [] = Util.readFile (filename);
// 执行加密操作
Byte encryptedClassData [] = cipher.doFinal(data );
// 保存加密后的文gQ覆盖原有的cL件?#160;
Util.writeFile( filename, encryptedClassData );
Q?Q解密数据。运行经q加密的E序ӞClassLoader分析q解密类文g。操作步骤如下所C?

  【用密钥解密数据?br />
// 生成一个可信Q的随机数?/span>
SecureRandom sr = new SecureRandom();
// 从密钥文件中获取原始密钥数据
Byte rawKeyData[] = Util.readFile( keyFilename );
// 创徏一个DESKeySpec对象
DESKeySpec dks = new DESKeySpec (rawKeyData);
// 创徏一个密钥工厂,然后用它把DESKeySpec对象转换成Secret Key对象 
SecretKeyFactory key Factory = SecretKeyFactory.getInstance( "DES" );
SecretKey key 
= keyFactory.generateSecret( dks );
// Cipher对象实际完成解密操作
Cipher cipher = Cipher.getInstance( "DES" );
// 用密钥初始化Cipher对象
Cipher.init( Cipher.DECRYPT_MODE, key, sr );
// 获得l过加密的数?/span>
Byte encrypted Data [] = Util.readFile (Filename);
//执行解密操作
Byte decryptedData [] = cipher.doFinal( encryptedData );
// 然后解密后的数据{化成原来的类文g?/span>
上qC码与自定义的c装载器l合可以做到边解密边运行,从而vC护源代码的作用?br />
  l束?/font>

  加密/解密是数据传输中保证数据安全性和完整性的常用ҎQJava语言因其q_无关性,在Internet上的应用非常之广泛。用DES法加密Java源码在一定程度上能保护Y件的产权?

暗夜_ 2006-11-04 16:59 发表评论
]]>
վ֩ģ壺 | | | Ǩ| Ӧ| ̨| ɽ| Դ| ̨ʡ| Ǹ| Ļ| ̩| | | Ԫı| | | | ؿ˹| | ̩˳| | | Ԫ| ӥ̶| ˶| | ¤| | ̶| | | | Զ| | Ҧ| «ɽ| | | | ˱|