﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-oneJavaer-随笔分类-Java</title><link>http://www.blogjava.net/onejavaer/category/46182.html</link><description>让我在热血沸腾中度此一生 让我在醇酒般的幻梦里醉沉！莫使我眼见这泥塑的肉身，终以空虚的躯壳毁于泥尘</description><language>zh-cn</language><lastBuildDate>Tue, 31 Aug 2010 15:29:37 GMT</lastBuildDate><pubDate>Tue, 31 Aug 2010 15:29:37 GMT</pubDate><ttl>60</ttl><item><title>利用DES加密算法保护Java源代码 </title><link>http://www.blogjava.net/onejavaer/archive/2006/11/04/79081.html</link><dc:creator>暗夜精灵</dc:creator><author>暗夜精灵</author><pubDate>Sat, 04 Nov 2006 08:59:00 GMT</pubDate><guid>http://www.blogjava.net/onejavaer/archive/2006/11/04/79081.html</guid><wfw:comment>http://www.blogjava.net/onejavaer/comments/79081.html</wfw:comment><comments>http://www.blogjava.net/onejavaer/archive/2006/11/04/79081.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/onejavaer/comments/commentRss/79081.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/onejavaer/services/trackbacks/79081.html</trackback:ping><description><![CDATA[		<p>
				<span class="span">作者：李琴 李家明&#160;&#160; </span>
				<span class="span">出处：计算机与信息技术</span>
		</p>
		<p>&#160;<strong>摘 要</strong>：本文首先分析了Java源代码需要加密的原因，简要介绍了<a class="bluekey" href="http://www.yesky.com/key/2018/162018.html" target="_blank"><font color="#005880">DES</font></a>算法及Java密码体系和Java密码扩展，最后说明了利用DES<a class="bluekey" href="http://www.yesky.com/key/2719/172719.html" target="_blank"><font color="#005880">加密算法</font></a>保护Java源代码的方法及步骤。<br /><br />　　<strong>关键词</strong> Java 加密 <a class="bluekey" href="http://www.yesky.com/key/4888/164888.html" target="_blank"><font color="#005880">DES算法</font></a><br /><br />　　Java语言是一种非常适用于<a class="bluekey" href="http://www.yesky.com/key/3847/8847.html" target="_blank"><font color="#005880">网络编程</font></a>的语言，它的基本结构与C++极为相似，但抛弃了<a class="bluekey" href="http://www.yesky.com/key/4630/39630.html" target="_blank"><font color="#005880">C/C</font></a>++中指针等内容，同时它吸收了Smalltalk、C++面向对象的编程思想。它具有简单性、鲁棒性、可移植性、动态性等特点。这些特点使得Java成为跨平台应用开发的一种规范，在世界范围内广泛流传。<br /><br />　　<strong>加密Java源码的原因</strong><br /><br />　　Java源代码经过编译以后在JVM中执行。由于JVM界面是完全透明的，<a class="bluekey" href="http://www.yesky.com/key/579/115579.html" target="_blank"><font color="#005880">Java类</font></a>文件能够很容易通过<a class="bluekey" href="http://www.yesky.com/key/323/85323.html" target="_blank"><font color="#005880">反编译</font></a>器重新转换成源代码。因此，所有的算法、类文件等都可以以源代码的形式被公开，使得软件不能受到保护，为了保护产权，一般可以有以下几种方法：<br /><br />　　（1）"模糊"类文件，加大反<a class="bluekey" href="http://www.yesky.com/key/1922/91922.html" target="_blank"><font color="#005880">编译器</font></a>反编译源代码文件的难度。然而，可以修改反编译器，使之能够处理这些模糊类文件。所以仅仅依赖"模糊类文件"来保证代码的安全是不够的。<br /><br />　　（2）流行的加密工具对<a class="bluekey" href="http://www.yesky.com/key/1862/161862.html" target="_blank"><font color="#005880">源文件</font></a>进行加密，比如<a class="bluekey" href="http://www.yesky.com/key/1569/146569.html" target="_blank"><font color="#005880">PGP</font></a>（<a class="bluekey" href="http://www.yesky.com/key/2510/107510.html" target="_blank"><font color="#005880">Pretty</font></a> Good Privacy）或GPG（<a class="bluekey" href="http://www.yesky.com/key/3649/118649.html" target="_blank"><font color="#005880">GNU</font></a> Privacy Guard）。这时，最终用户在运行应用之前必须先进行<a class="bluekey" href="http://www.yesky.com/key/2702/77702.html" target="_blank"><font color="#005880">解密</font></a>。但解密之后，最终用户就有了一份不加密的类文件，这和事先不进行加密没有什么差别。<br /><br />　　（3）加密类文件，在运行中JVM用定制的类装载器（Class <a class="bluekey" href="http://www.yesky.com/key/834/160834.html" target="_blank"><font color="#005880">Loader</font></a>）解密类文件。Java运行时装入字节码的机制隐含地意味着可以对字节码进行修改。JVM每次装入类文件时都需要一个称为ClassLoader的对象，这个对象负责把新的类装入正在运行的JVM。JVM给ClassLoader一个包含了待装入类（例如java.lang.Object）名字的字符串，然后由ClassLoader负责找到类文件，装入原始数据，并把它转换成一个Class对象。<br /><br />　　用户下载的是加密过的类文件，在加密类文件装入之时进行解密，因此可以看成是一种即时解密器。由于解密后的字节码文件永远不会保存到<a class="bluekey" href="http://www.yesky.com/key/408/15408.html" target="_blank"><font color="#005880">文件系统</font></a>，所以<a class="bluekey" href="http://www.yesky.com/key/1907/166907.html" target="_blank"><font color="#005880">窃密</font></a>者很难得到解密后的代码。 <br /><br />　　由于把原始字节码转换成Class对象的过程完全由系统负责，所以创建定制ClassLoader对象其实并不困难，只需先获得原始数据，接着就可以进行包含解密在内的任何转换。<br /><br />　　<strong>Java密码体系和Java密码扩展</strong><br /><br />　　Java密码体系(JCA)和Java密码扩展(JCE)的设计目的是为Java提供与实现无关的加密函数API。它们都用factory方法来创建类的例程，然后把实际的加密函数委托给提供者指定的底层引擎,引擎中为类提供了服务提供者接口在Java中实现数据的加密/解密，是使用其内置的JCE(Java加密扩展)来实现的。<a class="bluekey" href="http://www.yesky.com/key/1860/161860.html" target="_blank"><font color="#005880">Java开发</font></a>工具集1.1为实现包括<a class="bluekey" href="http://www.yesky.com/key/2343/7343.html" target="_blank"><font color="#005880">数字签名</font></a>和信息摘要在内的加密功能，推出了一种基于供应商的新型灵活应用编程接口。Java密码体系结构支持供应商的互操作,同时支持硬件和软件实现。<br /><br />　　Java密码学<a class="bluekey" href="http://www.yesky.com/key/2834/172834.html" target="_blank"><font color="#005880">结构设计</font></a>遵循两个原则:<br /><br />　　(1)算法的独立性和可靠性。<br /><br />　　(2)实现的独立性和相互作用性。<br /><br />　　算法的独立性是通过定义密码服务类来获得。用户只需了解<a class="bluekey" href="http://www.yesky.com/key/3430/173430.html" target="_blank"><font color="#005880">密码算法</font></a>的概念,而不用去关心如何实现这些概念。实现的独立性和相互作用性通过密码服务提供器来实现。密码服务提供器是实现一个或多个密码服务的一个或多个程序包。软件开发商根据一定接口,将各种算法实现后,打包成一个提供器,用户可以安装不同的提供器。安装和配置提供器,可将包含提供器的<a class="bluekey" href="http://www.yesky.com/key/2809/32809.html" target="_blank"><font color="#005880">ZIP</font></a>和<a class="bluekey" href="http://www.yesky.com/key/1290/1290.html" target="_blank"><font color="#005880">JAR</font></a>文件放在<a class="bluekey" href="http://www.yesky.com/key/907/5907.html" target="_blank"><font color="#005880">CLASSPATH</font></a>下,再编辑Java安全属性文件来设置定义一个提供器。Java运行环境Sun版本时, 提供一个缺省的提供器Sun。<br /><br />　　下面介绍<a class="bluekey" href="http://www.yesky.com/key/3186/213186.html" target="_blank"><font color="#005880">DES</font></a>算法及如何利用DES算法<a class="bluekey" href="http://www.yesky.com/key/3605/78605.html" target="_blank"><font color="#005880">加密和解密</font></a>类文件的步骤。<br /><br />　　<strong>DES算法简介</strong><br /><br />　　DES（<a class="bluekey" href="http://www.yesky.com/key/65/160065.html" target="_blank"><font color="#005880">Data</font></a> Encryption <a class="bluekey" href="http://www.yesky.com/key/2558/102558.html" target="_blank"><font color="#005880">Standard</font></a>）是发明最早的最广泛使用的分组对称加密算法。DES算法的入口参数有三个：<a class="bluekey" href="http://www.yesky.com/key/697/160697.html" target="_blank"><font color="#005880">Key</font></a>、<a class="bluekey" href="http://www.yesky.com/key/4223/124223.html" target="_blank"><font color="#005880">Data</font></a>、Mode。其中<a class="bluekey" href="http://www.yesky.com/key/2043/162043.html" target="_blank"><font color="#005880">Key</font></a>为8个字节共64位，是DES算法的工作密钥；Data也为8个字节64位，是要被加密或被解密的数据；Mode为DES的工作方式，有两种：加密或解密。<br /><br />　　DES算法工作流程如下：若Mode为加密模式，则利用Key 对数据Data进行加密， 生成Data的密码形式（64位）作为DES的输出结果；如Mode为解密模式，则利用Key对密码形式的数据Data进行解密，还原为Data的明码形式（64位）作为DES的输出结果。在<a class="bluekey" href="http://www.yesky.com/key/1686/166686.html" target="_blank"><font color="#005880">通信网</font></a>络的两端，双方约定一致的Key，在通信的源点用Key对核心数据进行DES加密，然后以密码形式在公共通信网（如<a class="bluekey" href="http://www.yesky.com/key/3785/153785.html" target="_blank"><font color="#005880">电话网</font></a>）中传输到<a class="bluekey" href="http://www.yesky.com/key/3953/158953.html" target="_blank"><font color="#005880">通信网络</font></a>的终点，数据到达目的地后，用同样的Key对密码数据进行解密，便再现了明码形式的核心数据。这样，便保证了核心数据在公共通信网中传输的安全性和可靠性。<br /><br />　　也可以通过定期在通信网络的源端和目的端同时改用新的Key，便能更进一步提高数据的保密性。<br /><strong>利用DES算法加密的步骤<br /><br /></strong>　　（1）生成一个安全密钥。在加密或解密任何数据之前需要有一个密钥。密钥是随同被加密的应用程序一起发布的一段数据，密钥代码如下所示。<br /><br />　　【生成一个密钥代码】<br /></p>
		<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
				<div>
						<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">&#160;生成一个可信任的随机数源</span>
						<span style="COLOR: #008000">
								<br />
								<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #000000">Secure&#160;Random&#160;sr&#160;</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">&#160;</span>
						<span style="COLOR: #0000ff">new</span>
						<span style="COLOR: #000000">&#160;SecureRandom();<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">&#160;为我们选择的DES算法生成一个KeyGenerator对象</span>
						<span style="COLOR: #008000">
								<br />
								<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #000000">KeyGenerator&#160;kg&#160;</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">&#160;KeyGenerator.getInstance&#160;(</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">DES</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">&#160;);<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />Kg.init&#160;(sr);<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">&#160;生成密钥</span>
						<span style="COLOR: #008000">
								<br />
								<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #000000">Secret&#160;Key&#160;key&#160;</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">&#160;kg.generateKey();<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">&#160;将密钥数据保存为文件供以后使用，其中key&#160;Filename为保存的文件名</span>
						<span style="COLOR: #008000">
								<br />
								<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #000000">Util.writeFile&#160;(key&#160;Filename,&#160;key.getEncoded&#160;()&#160;);</span>
				</div>
		</div>
		<br />2）加密数据。得到密钥之后，接下来就可以用它加密数据。如下所示。<br /><br />　　【用密钥加密原始数据】<br /><div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"><div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&#160;产生一个可信任的随机数源</span><span style="COLOR: #008000"><br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">SecureRandom&#160;sr&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&#160;SecureRandom();<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">从密钥文件key&#160;Filename中得到密钥数据</span><span style="COLOR: #008000"><br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">Byte&#160;rawKeyData&#160;[]&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;Util.readFile&#160;(key&#160;Filename);<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&#160;从原始密钥数据创建DESKeySpec对象</span><span style="COLOR: #008000"><br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">DESKeySpec&#160;dks&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&#160;DESKeySpec&#160;(rawKeyData);<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&#160;创建一个密钥工厂，然后用它把DESKeySpec转换成Secret&#160;Key对象</span><span style="COLOR: #008000"><br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">SecretKeyFactory&#160;key&#160;Factory&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;SecretKeyFactory.getInstance(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">DES</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&#160;);<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />Secret&#160;Key&#160;key&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;keyFactory.generateSecret(&#160;dks&#160;);<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&#160;Cipher对象实际完成加密操作</span><span style="COLOR: #008000"><br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">Cipher&#160;cipher&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;Cipher.getInstance(&#160;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">DES</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&#160;);<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&#160;用密钥初始化Cipher对象</span><span style="COLOR: #008000"><br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">cipher.init(&#160;Cipher.ENCRYPT_MODE,&#160;key,&#160;sr&#160;);<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&#160;通过读类文件获取需要加密的数据</span><span style="COLOR: #008000"><br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">Byte&#160;data&#160;[]&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;Util.readFile&#160;(filename);<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&#160;执行加密操作</span><span style="COLOR: #008000"><br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">Byte&#160;encryptedClassData&#160;[]&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;cipher.doFinal(data&#160;);<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&#160;保存加密后的文件，覆盖原有的类文件。&#160;</span><span style="COLOR: #008000"><br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">Util.writeFile(&#160;filename,&#160;encryptedClassData&#160;);</span></div></div>（3）解密数据。运行经过加密的程序时，ClassLoader分析并解密类文件。操作步骤如下所示。 <br /><br />　　【用密钥解密数据】<br /><div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"><div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&#160;生成一个可信任的随机数源</span><span style="COLOR: #008000"><br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">SecureRandom&#160;sr&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&#160;SecureRandom();<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&#160;从密钥文件中获取原始密钥数据</span><span style="COLOR: #008000"><br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">Byte&#160;rawKeyData[]&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;Util.readFile(&#160;keyFilename&#160;);<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&#160;创建一个DESKeySpec对象</span><span style="COLOR: #008000"><br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">DESKeySpec&#160;dks&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&#160;DESKeySpec&#160;(rawKeyData);<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&#160;创建一个密钥工厂，然后用它把DESKeySpec对象转换成Secret&#160;Key对象&#160;</span><span style="COLOR: #008000"><br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">SecretKeyFactory&#160;key&#160;Factory&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;SecretKeyFactory.getInstance(&#160;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">DES</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&#160;);<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />SecretKey&#160;key&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;keyFactory.generateSecret(&#160;dks&#160;);<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&#160;Cipher对象实际完成解密操作</span><span style="COLOR: #008000"><br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">Cipher&#160;cipher&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;Cipher.getInstance(&#160;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">DES</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&#160;);<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&#160;用密钥初始化Cipher对象</span><span style="COLOR: #008000"><br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">Cipher.init(&#160;Cipher.DECRYPT_MODE,&#160;key,&#160;sr&#160;);<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&#160;获得经过加密的数据</span><span style="COLOR: #008000"><br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">Byte&#160;encrypted&#160;Data&#160;[]&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;Util.readFile&#160;(Filename);<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">执行解密操作</span><span style="COLOR: #008000"><br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">Byte&#160;decryptedData&#160;[]&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;cipher.doFinal(&#160;encryptedData&#160;);<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&#160;然后将解密后的数据转化成原来的类文件。</span></div></div>将上述代码与自定义的类装载器结合就可以做到边解密边运行，从而起到保护源代码的作用。<br /><br />　　<strong><a class="bluekey" href="http://www.yesky.com/key/4257/29257.html" target="_blank"><font color="#005880">结束语</font></a></strong><br /><br />　　加密/解密是数据传输中保证数据安全性和完整性的常用方法，Java语言因其平台无关性，在Internet上的应用非常之广泛。使用DES算法加密Java源码在一定程度上能保护软件的产权。 <img src ="http://www.blogjava.net/onejavaer/aggbug/79081.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/onejavaer/" target="_blank">暗夜精灵</a> 2006-11-04 16:59 <a href="http://www.blogjava.net/onejavaer/archive/2006/11/04/79081.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>