<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Sparkle&#039;s Workshop &#187; des</title>
	<atom:link href="http://weavesky.com/tag/des/feed/" rel="self" type="application/rss+xml" />
	<link>http://weavesky.com</link>
	<description></description>
	<lastBuildDate>Fri, 30 Dec 2011 08:14:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>如何用Java进行3DES加密解密</title>
		<link>http://weavesky.com/2008/01/05/java-3des/</link>
		<comments>http://weavesky.com/2008/01/05/java-3des/#comments</comments>
		<pubDate>Sat, 05 Jan 2008 07:19:34 +0000</pubDate>
		<dc:creator>Sparkle</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[des]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://69.197.153.196/?p=527</guid>
		<description><![CDATA[最近一个合作商提出使用3DES交换数据，本来他们有现成的代码，可惜只有.net版本，我们的服务器都是Linux，而且应用都是Java。于是对照他们提供的代码改了一个Java的版本出来，主要是不熟悉3DES，折腾了一天，终于搞定。 所谓3DES，就是把DES做三次，当然不是简单地DES DES DES就行了，中途有些特定的排列。这个我可不关心，呵呵，我的目的是使用它。 在网上搜索了一下3DES，找到很少资料。经过朋友介绍，找到GNU Crypto和Bouncy Castle两个Java扩充包，里面应该有3DES的实现吧。 从GNU Crypto入手，找到一个TripleDES的实现类，发现原来3DES还有一个名字叫DESede，在网上搜索TripleDES和DESede，呵呵，终于发现更多的资料了。 Java的安全API始终那么难用，先创建一个cipher看看算法在不在吧 Cipher cipher = Cipher.getInstance&#40;&#34;DESede&#34;&#41;; 如果没有抛异常的话，就证明这个算法是有效的 突然想看看JDK有没有内置DESede，于是撇开Crypto，直接测试，发现可以正确运行。在jce.jar里面找到相关的类，JDK内置了。 于是直接用DES的代码来改&#038;测试，最后代码变成这样 SecureRandom sr = new SecureRandom&#40;&#41;; DESedeKeySpec dks = new DESedeKeySpec&#40;PASSWORD_CRYPT_KEY.getBytes&#40;&#41;&#41;; SecretKeyFactory keyFactory = SecretKeyFactory.getInstance&#40;&#34;DESede&#34;&#41;; SecretKey securekey = keyFactory.generateSecret&#40;dks&#41;; Cipher cipher = Cipher.getInstance&#40;&#34;DESede&#34;&#41;; cipher.init&#40;Cipher.ENCRYPT_MODE, &#8230; <a class="more-link" href="http://weavesky.com/2008/01/05/java-3des/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>最近一个合作商提出使用3DES交换数据，本来他们有现成的代码，可惜只有.net版本，我们的服务器都是Linux，而且应用都是Java。于是对照他们提供的代码改了一个Java的版本出来，主要是不熟悉3DES，折腾了一天，终于搞定。</p>
<p>所谓3DES，就是把DES做三次，当然不是简单地DES DES DES就行了，中途有些特定的排列。这个我可不关心，呵呵，我的目的是使用它。</p>
<p>在网上搜索了一下3DES，找到很少资料。经过朋友介绍，找到GNU Crypto和Bouncy Castle两个Java扩充包，里面应该有3DES的实现吧。</p>
<p>从GNU Crypto入手，找到一个TripleDES的实现类，发现原来3DES还有一个名字叫DESede，在网上搜索TripleDES和DESede，呵呵，终于发现更多的资料了。</p>
<p>Java的安全API始终那么难用，先创建一个cipher看看算法在不在吧</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">Cipher cipher <span style="color: #339933;">=</span> Cipher.<span style="color: #006633;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;DESede&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>如果没有抛异常的话，就证明这个算法是有效的</p>
<p>突然想看看JDK有没有内置DESede，于是撇开Crypto，直接测试，发现可以正确运行。在jce.jar里面找到相关的类，JDK内置了。</p>
<p>于是直接用DES的代码来改&#038;测试，最后代码变成这样</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #003399;">SecureRandom</span> sr <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">SecureRandom</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
DESedeKeySpec dks <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> DESedeKeySpec<span style="color: #009900;">&#40;</span>PASSWORD_CRYPT_KEY.<span style="color: #006633;">getBytes</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
SecretKeyFactory keyFactory <span style="color: #339933;">=</span> SecretKeyFactory.<span style="color: #006633;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;DESede&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
SecretKey securekey <span style="color: #339933;">=</span> keyFactory.<span style="color: #006633;">generateSecret</span><span style="color: #009900;">&#40;</span>dks<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
Cipher cipher <span style="color: #339933;">=</span> Cipher.<span style="color: #006633;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;DESede&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
cipher.<span style="color: #006633;">init</span><span style="color: #009900;">&#40;</span>Cipher.<span style="color: #006633;">ENCRYPT_MODE</span>, securekey, sr<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">String</span><span style="color: #009900;">&#40;</span>Hex.<span style="color: #006633;">encodeHex</span><span style="color: #009900;">&#40;</span>cipher.<span style="color: #006633;">doFinal</span><span style="color: #009900;">&#40;</span>str.<span style="color: #006633;">getBytes</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>需要留意的是，要使用DESede的Spec、Factory和Cipher才行</p>
<p>事情还没完结，合作商给过来的除了密钥之外，还有一个IV向量。搜索了一下，发现有一个IvParameterSpec类，于是代码变成这样</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #003399;">SecureRandom</span> sr <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">SecureRandom</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
DESedeKeySpec dks <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> DESedeKeySpec<span style="color: #009900;">&#40;</span>PASSWORD_CRYPT_KEY.<span style="color: #006633;">getBytes</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
SecretKeyFactory keyFactory <span style="color: #339933;">=</span> SecretKeyFactory.<span style="color: #006633;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;DESede&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
SecretKey securekey <span style="color: #339933;">=</span> keyFactory.<span style="color: #006633;">generateSecret</span><span style="color: #009900;">&#40;</span>dks<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
IvParameterSpec iv <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> IvParameterSpec<span style="color: #009900;">&#40;</span>PASSWORD_IV.<span style="color: #006633;">getBytes</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
Cipher cipher <span style="color: #339933;">=</span> Cipher.<span style="color: #006633;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;DESede&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
cipher.<span style="color: #006633;">init</span><span style="color: #009900;">&#40;</span>Cipher.<span style="color: #006633;">ENCRYPT_MODE</span>, securekey, iv, sr<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">String</span><span style="color: #009900;">&#40;</span>Hex.<span style="color: #006633;">encodeHex</span><span style="color: #009900;">&#40;</span>cipher.<span style="color: #006633;">doFinal</span><span style="color: #009900;">&#40;</span>str.<span style="color: #006633;">getBytes</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>但是，运行报错了</p>
<blockquote><p>
java.security.InvalidAlgorithmParameterException: ECB mode cannot use IV
</p></blockquote>
<p>ECB是什么呢？我的代码完全没有写ECB什么的</p>
<p>又上网搜索，结果把DES的来龙去脉都搞清楚了</p>
<p>http://www.tropsoft.com/strongenc/des.htm</p>
<p>ECB是其中一种字串分割方式，除了DES以外，其他加密方式也会使用这种分割方式的，而Java默认产生的DES算法就是用ECB方法，ECB不需要向量，当然也就不支持向量了</p>
<p>除了ECB，DES还支持CBC、CFB、OFB，而3DES只支持ECB和CBC两种</p>
<p>http://www.tropsoft.com/strongenc/des3.htm</p>
<p>CBC支持并且必须有向量，具体算法这里就不说了。合作商给的.net代码没有声明CBC模式，似乎是.net默认的方式就是CBC的</p>
<p>于是把模式改成CBC</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">Cipher cipher <span style="color: #339933;">=</span> Cipher.<span style="color: #006633;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;DESede/CBC/PKCS5Padding&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>成功运行了</p>
<p>后话：</p>
<p>搜索的过程中，找到一个不错的讨论</p>
<blockquote>
<p>http://www.lslnet.com/linux/dosc1/21/linux-197579.htm</p>
<p>在CBC（不光是DES算法）模式下，iv通过随机数（或伪随机）机制产生是一种比较常见的方法。iv的作用主要是用于产生密文的第一个block，以使最终生成的密文产生差异（明文相同的情况下），使密码攻击变得更为困难，除此之外iv并无其它用途。因此iv通过随机方式产生是一种十分简便、有效的途径。此外，在IPsec中采用了DES-CBC作为缺省的加密方式，其使用的iv是通讯包的时间戳。从原理上来说，这与随机数机制并无二致。
</p></blockquote>
<p>看来，向量的作用其实就是salt</p>
<p>最大的好处是，可以令到即使相同的明文，相同的密钥，能产生不同的密文</p>
<p>例如，我们用DES方式在数据保存用户密码的时候，可以另外增加一列，把向量同时保存下来，并且每次用不同的向量。这样的好处是，即使两个用户的密码是一样的，数据库保存的密文，也会不一样，就能降低猜测的可能性</p>
<p>另外一种用法，就是类似IPsec的做法，两部主机互传数据，保证两部机的时钟同步的前提下（可以取样到分钟或更高的单位避免偏差），用时钟的变化值作为向量，就能增加被sniffer数据的解密难度</p>
<h2  class="related_post_title">Related Posts</h2><ul class="related_post"><li><a href="http://weavesky.com/2008/01/05/java-des/" title="如何用Java进行DES加密解密">如何用Java进行DES加密解密</a></li><li><a href="http://weavesky.com/2010/02/19/mina-article-4/" title="基于MINA构建简单高性能的NIO应用-优化指南">基于MINA构建简单高性能的NIO应用-优化指南</a></li><li><a href="http://weavesky.com/2010/02/19/mina-article-3/" title="基于MINA构建简单高性能的NIO应用-MINA架构">基于MINA构建简单高性能的NIO应用-MINA架构</a></li><li><a href="http://weavesky.com/2010/02/19/mina-article-2/" title="基于MINA构建简单高性能的NIO应用-一个简单的例子">基于MINA构建简单高性能的NIO应用-一个简单的例子</a></li><li><a href="http://weavesky.com/2010/02/19/mina-article-1/" title="基于MINA构建简单高性能的NIO应用-前言">基于MINA构建简单高性能的NIO应用-前言</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://weavesky.com/2008/01/05/java-3des/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>如何用Java进行DES加密解密</title>
		<link>http://weavesky.com/2008/01/05/java-des/</link>
		<comments>http://weavesky.com/2008/01/05/java-des/#comments</comments>
		<pubDate>Sat, 05 Jan 2008 05:08:08 +0000</pubDate>
		<dc:creator>Sparkle</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[des]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://69.197.153.196/?p=526</guid>
		<description><![CDATA[这篇其实是引子，直接贴代码，不多解释了 SecureRandom sr = new SecureRandom&#40;&#41;; DESKeySpec dks = new DESKeySpec&#40;PASSWORD_CRYPT_KEY.getBytes&#40;&#41;&#41;; SecretKeyFactory keyFactory = SecretKeyFactory.getInstance&#40;&#34;DES&#34;&#41;; SecretKey securekey = keyFactory.generateSecret&#40;dks&#41;; Cipher cipher = Cipher.getInstance&#40;&#34;DES&#34;&#41;; cipher.init&#40;Cipher.ENCRYPT_MODE, securekey, sr&#41;; return new String&#40;Hex.encodeHex&#40;cipher.doFinal&#40;str.getBytes&#40;&#41;&#41;&#41;&#41;; SecureRandom sr = new SecureRandom&#40;&#41;; DESKeySpec dks = new DESKeySpec&#40;PASSWORD_CRYPT_KEY.getBytes&#40;&#41;&#41;; SecretKeyFactory &#8230; <a class="more-link" href="http://weavesky.com/2008/01/05/java-des/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>这篇其实是引子，直接贴代码，不多解释了</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #003399;">SecureRandom</span> sr <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">SecureRandom</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
DESKeySpec dks <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> DESKeySpec<span style="color: #009900;">&#40;</span>PASSWORD_CRYPT_KEY.<span style="color: #006633;">getBytes</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
SecretKeyFactory keyFactory <span style="color: #339933;">=</span> SecretKeyFactory.<span style="color: #006633;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;DES&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
SecretKey securekey <span style="color: #339933;">=</span> keyFactory.<span style="color: #006633;">generateSecret</span><span style="color: #009900;">&#40;</span>dks<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
Cipher cipher <span style="color: #339933;">=</span> Cipher.<span style="color: #006633;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;DES&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
cipher.<span style="color: #006633;">init</span><span style="color: #009900;">&#40;</span>Cipher.<span style="color: #006633;">ENCRYPT_MODE</span>, securekey, sr<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">String</span><span style="color: #009900;">&#40;</span>Hex.<span style="color: #006633;">encodeHex</span><span style="color: #009900;">&#40;</span>cipher.<span style="color: #006633;">doFinal</span><span style="color: #009900;">&#40;</span>str.<span style="color: #006633;">getBytes</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #003399;">SecureRandom</span> sr <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">SecureRandom</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
DESKeySpec dks <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> DESKeySpec<span style="color: #009900;">&#40;</span>PASSWORD_CRYPT_KEY.<span style="color: #006633;">getBytes</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
SecretKeyFactory keyFactory <span style="color: #339933;">=</span> SecretKeyFactory.<span style="color: #006633;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;DES&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
SecretKey securekey <span style="color: #339933;">=</span> keyFactory.<span style="color: #006633;">generateSecret</span><span style="color: #009900;">&#40;</span>dks<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
Cipher cipher <span style="color: #339933;">=</span> Cipher.<span style="color: #006633;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;DES&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
cipher.<span style="color: #006633;">init</span><span style="color: #009900;">&#40;</span>Cipher.<span style="color: #006633;">DECRYPT_MODE</span>, securekey, sr<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">String</span><span style="color: #009900;">&#40;</span>cipher.<span style="color: #006633;">doFinal</span><span style="color: #009900;">&#40;</span>Hex.<span style="color: #006633;">decodeHex</span><span style="color: #009900;">&#40;</span>str.<span style="color: #006633;">toCharArray</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<h2  class="related_post_title">Related Posts</h2><ul class="related_post"><li><a href="http://weavesky.com/2008/01/05/java-3des/" title="如何用Java进行3DES加密解密">如何用Java进行3DES加密解密</a></li><li><a href="http://weavesky.com/2010/02/19/mina-article-4/" title="基于MINA构建简单高性能的NIO应用-优化指南">基于MINA构建简单高性能的NIO应用-优化指南</a></li><li><a href="http://weavesky.com/2010/02/19/mina-article-3/" title="基于MINA构建简单高性能的NIO应用-MINA架构">基于MINA构建简单高性能的NIO应用-MINA架构</a></li><li><a href="http://weavesky.com/2010/02/19/mina-article-2/" title="基于MINA构建简单高性能的NIO应用-一个简单的例子">基于MINA构建简单高性能的NIO应用-一个简单的例子</a></li><li><a href="http://weavesky.com/2010/02/19/mina-article-1/" title="基于MINA构建简单高性能的NIO应用-前言">基于MINA构建简单高性能的NIO应用-前言</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://weavesky.com/2008/01/05/java-des/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

