<?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>Fwolf's Blog &#187; mcrypt - Fwolf's Blog</title>
	<atom:link href="http://www.fwolf.com/blog/post/tag/mcrypt/feed" rel="self" type="application/rss+xml" />
	<link>http://www.fwolf.com/blog</link>
	<description>随心·随意·随缘·努力～</description>
	<lastBuildDate>Sun, 29 Aug 2010 14:52:23 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>可恶，被 PHP-Mcrypt 的官方 Example 误导了</title>
		<link>http://www.fwolf.com/blog/post/450</link>
		<comments>http://www.fwolf.com/blog/post/450#comments</comments>
		<pubDate>Wed, 21 Oct 2009 18:15:10 +0000</pubDate>
		<dc:creator>Fwolf</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[crypt]]></category>
		<category><![CDATA[encrypt]]></category>
		<category><![CDATA[mcrypt]]></category>
		<category><![CDATA[random]]></category>
		<category><![CDATA[think]]></category>
		<category><![CDATA[wrong]]></category>

		<guid isPermaLink="false">http://www.fwolf.com/blog/?p=450</guid>
		<description><![CDATA[在看 php 的 mcrypt 加密，想使用对称算法，解决小块内容（比如 url、post）网上传输的安全性。即加密、解密用同一个密码。官方文档有个非常完整的演示功能的例子，大概顺序是： 打开 module 生成 IV 得到 key/密钥/密码 初始化（引擎？） 进行加密操作 关闭（引擎？） 重新初始化（引擎？） 进行解密操作 关闭（引擎？） 关闭 module 加密、解密放在了一个代码片段中，大概是想说，加、解密就那一句代码不同而已。 按照这个理解，为了使用方便，我把加、解密分解成了2个函数，内容都和例子差不多，不会有错。但一运行，不管用哪种加密算法，都会出现奇怪的解密后与原文不一致的错误。还不是完全不一致，后面大半段内容都是正确的，比如原文是包含 a-z 26个字母的字符串，运行结果如下： $ ./mcrypt.php Encrypt: M~&#60;5¶¤Jw^TÝ×. ÃV¯ Decrypt: Âò¹ÁIijklmnopqrstuvwxyz 好一通找原因，最后在支持算法列表页面中找到这么一句：The IV must be unique and must be the same when decrypting/encrypting.加、解密时所使用的 IV 必须相同。 昏，例子代码中 IV 是使用随机数生成的，分成2个函数之后，加、解密操作生成的 IV 肯定不一样，这就是解密失败的原因。mcrypt_create_iv() 函数文档页面的 user notes 中有位 Chris 还对 [...]]]></description>
			<content:encoded><![CDATA[<p>在看 php 的 mcrypt 加密，想使用对称算法，解决小块内容（比如 url、post）网上传输的安全性。即加密、解密用同一个密码。<a href="http://cn.php.net/manual/en/function.mcrypt-module-open.php">官方文档</a>有个非常完整的演示功能的例子，大概顺序是：</p>

<ul>
<li>打开 module</li>
<li>生成 IV</li>
<li>得到 key/密钥/密码</li>
<li>初始化（引擎？）</li>
<li>进行加密操作</li>
<li>关闭（引擎？）</li>
<li>重新初始化（引擎？）</li>
<li>进行解密操作</li>
<li>关闭（引擎？）</li>
<li>关闭 module</li>
</ul>

<p>加密、解密放在了一个代码片段中，大概是想说，加、解密就那一句代码不同而已。</p>

<p>按照这个理解，为了使用方便，我把加、解密分解成了2个函数，内容都和例子差不多，不会有错。但一运行，不管用哪种加密算法，都会出现奇怪的解密后与原文不一致的错误。还不是完全不一致，后面大半段内容都是正确的，比如原文是包含 a-z 26个字母的字符串，运行结果如下：</p>

<pre><code>$ ./mcrypt.php 
Encrypt:
M~&lt;5¶¤Jw^TÝ×. ÃV¯
Decrypt:
Âò¹ÁIijklmnopqrstuvwxyz
</code></pre>

<p>好一通找原因，最后在<a href="http://cn.php.net/manual/en/mcrypt.ciphers.php">支持算法列表页面</a>中找到这么一句：<strong>The IV must be unique and must be the same when decrypting/encrypting.</strong>加、解密时所使用的 IV 必须相同。</p>

<p>昏，例子代码中 IV 是使用随机数生成的，分成2个函数之后，加、解密操作生成的 IV 肯定不一样，这就是解密失败的原因。<a href="http://cn.php.net/manual/en/function.mcrypt-create-iv.php">mcrypt_create_iv() 函数文档页面</a>的 user notes 中有位 <strong>Chris</strong> 还对 IV 纠正了一些错误观点。</p>

<p>综上，<strong>正确解密需要将 IV 与密文一同存储、传递</strong>。而我的需求比较简单，就没有必要这么作，反正 IV 也不需要保密，所以直接用 key 的 sha1 值的片断，比如前8位（与 git 版本号简写类似）作为 IV，对安全性影响不大，应该是可以接受的。</p>

<p>问题解决，收工，有和我一样吃过亏的同学么？</p>

	Tags: <a href="http://www.fwolf.com/blog/post/tag/crypt" title="crypt" rel="tag">crypt</a>, <a href="http://www.fwolf.com/blog/post/tag/encrypt" title="encrypt" rel="tag">encrypt</a>, <a href="http://www.fwolf.com/blog/post/tag/mcrypt" title="mcrypt" rel="tag">mcrypt</a>, <a href="http://www.fwolf.com/blog/post/tag/random" title="random" rel="tag">random</a>, <a href="http://www.fwolf.com/blog/post/tag/think" title="think" rel="tag">think</a>, <a href="http://www.fwolf.com/blog/post/tag/wrong" title="wrong" rel="tag">wrong</a><br />

	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.fwolf.com/blog/post/364" title="真正的“AI”，是不是可以这样？ (2007-10-30)">真正的“AI”，是不是可以这样？</a> (3)</li>
	<li><a href="http://www.fwolf.com/blog/post/420" title="用php_screw加密PHP代码 (2008-08-04)">用php_screw加密PHP代码</a> (0)</li>
	<li><a href="http://www.fwolf.com/blog/post/380" title="更安全的原因所在 (2008-01-17)">更安全的原因所在</a> (1)</li>
	<li><a href="http://www.fwolf.com/blog/post/404" title="忙碌的5月 (2008-06-13)">忙碌的5月</a> (10)</li>
	<li><a href="http://www.fwolf.com/blog/post/387" title="向太空移植生命 (2008-03-14)">向太空移植生命</a> (4)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.fwolf.com/blog/post/450/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>
