<?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; encrypt - Fwolf's Blog</title>
	<atom:link href="http://www.fwolf.com/blog/post/tag/encrypt/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>
		<item>
		<title>用php_screw加密PHP代码</title>
		<link>http://www.fwolf.com/blog/post/420</link>
		<comments>http://www.fwolf.com/blog/post/420#comments</comments>
		<pubDate>Mon, 04 Aug 2008 10:55:36 +0000</pubDate>
		<dc:creator>Fwolf</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[encrypt]]></category>
		<category><![CDATA[extension]]></category>

		<guid isPermaLink="false">http://www.fwolf.com/blog/?p=420</guid>
		<description><![CDATA[开始之前，首先要澄清两个问题：第一，支持开源，不等于反对代码加密；第二，如果把不属于自己的东西（比如公司的）拿去开源，就更加不应该了。 以前知道的，PHP代码的加密都是用Zend的encoder，这东西不但是商业软件，好像还暴出过能够被破解的问题，所以就找到了替代的方案────php_screw，一个日本人开发的东东。 php_screw非常小巧，没有仔细看过它的算法，但从说明文档中看，可以自行更改SEED，然后自行编译so和可执行档。如果够牛的话，甚至可以自己去更改算法。不管怎样，对于我们这些“普通人”来说，这种加密应该就够了吧，如果真想滴水不漏，那还是不要公开的好，虽然作者说的并不是很容易就破解，但指不定哪儿有牛群呢不是么？ 安装的环境需要：PHP5.x，zlib开启，autoconf，automake已安装。 测试环境：Ubuntu 8.04 hardy, PHP 5.2.3。 1、 解压，更改my_screw.h，里面的几个数字就是SEED，相当于密码，可以随意更改、增加，并且数字的多少不影响解密的速度。 2、编译so文件： $ phpize $ ./configure $ make 如果出现这样的错误，那是因为autoconf没有安装： $ make make: *** No targets specified and no makefile found. Stop. 3、安装so文件，编译好的文件在modules目录下，将其拷贝到php extension存放的位置，比如/usr/lib/php5/20060613+lfs下，然后在php.ini中增加： extension = php_screw.so 4、编译用来加密文件的可执行文件： $ cd tools $ make tools目录下新生成的screw就是了，放到$PATH中就可以调用了，比如要加密一个文件： $ screw a.php Success Crypting(a.php) 加密后的a.php执行正常，同时screw还会把原来没有加密的文件改名为.screw文件作为备份。 Update @ 2008-09-01 加密之后，还有个小问题，用require或include引用放在include_path下的加密代码时，会当做明文引过来，解决方法有两种： 使用绝对路径引用放在include_path下的加密内容，如果是自己的主机，肯定没问题的； 使用相对路径来引用，比如在本项目的子目录内，这样也是没问题的。 [...]]]></description>
			<content:encoded><![CDATA[<p>开始之前，首先要澄清两个问题：第一，支持开源，不等于反对代码加密；第二，如果把不属于自己的东西（比如公司的）拿去开源，就更加不应该了。</p>

<p>以前知道的，PHP代码的加密都是用Zend的encoder，这东西不但是商业软件，好像还暴出过能够被破解的问题，所以就找到了替代的方案────<a href="http://sourceforge.net/projects/php-screw/">php_screw</a>，一个<a href="http://www.pm9.com/newpm9/itbiz/php/phpscrew/">日本人</a>开发的东东。</p>

<p>php_screw非常小巧，没有仔细看过它的算法，但从说明文档中看，可以自行更改SEED，然后自行编译so和可执行档。如果够牛的话，甚至可以自己去更改算法。不管怎样，对于我们这些“普通人”来说，这种加密应该就够了吧，如果真想滴水不漏，那还是不要公开的好，虽然作者说的并不是很容易就破解，但指不定哪儿有牛群呢不是么？</p>

<p>安装的环境需要：PHP5.x，zlib开启，autoconf，automake已安装。</p>

<p>测试环境：Ubuntu 8.04 hardy, PHP 5.2.3。</p>

<p>1、 解压，更改<code>my_screw.h</code>，里面的几个数字就是SEED，相当于密码，可以随意更改、增加，并且数字的多少不影响解密的速度。</p>

<p>2、编译so文件：</p>

<pre><code>$ phpize
$ ./configure
$ make
</code></pre>

<p>如果出现这样的错误，那是因为autoconf没有安装：</p>

<pre><code>$ make
make: *** No targets specified and no makefile found.  Stop.
</code></pre>

<p>3、安装so文件，编译好的文件在<code>modules</code>目录下，将其拷贝到php extension存放的位置，比如<code>/usr/lib/php5/20060613+lfs</code>下，然后在php.ini中增加：</p>

<pre><code>extension = php_screw.so
</code></pre>

<p>4、编译用来加密文件的可执行文件：</p>

<pre><code>$ cd tools
$ make
</code></pre>

<p>tools目录下新生成的<code>screw</code>就是了，放到$PATH中就可以调用了，比如要加密一个文件：</p>

<pre><code>$ screw a.php
Success Crypting(a.php)
</code></pre>

<p>加密后的a.php执行正常，同时screw还会把原来没有加密的文件改名为<code>.screw</code>文件作为备份。</p>

<h4>Update @ 2008-09-01</h4>

<p>加密之后，还有个小问题，用require或include引用放在include_path下的加密代码时，会当做明文引过来，解决方法有两种：</p>

<ol>
<li>使用绝对路径引用放在include_path下的加密内容，如果是自己的主机，肯定没问题的；</li>
<li>使用相对路径来引用，比如在本项目的子目录内，这样也是没问题的。</li>
</ol>

	Tags: <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/extension" title="extension" rel="tag">extension</a>, <a href="http://www.fwolf.com/blog/post/tag/php" title="PHP" rel="tag">PHP</a><br />

	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.fwolf.com/blog/post/300" title="针对$_SERVER['PHP_SELF']的跨站脚本攻击（XSS） (2007-03-18)">针对$_SERVER['PHP_SELF']的跨站脚本攻击（XSS）</a> (3)</li>
	<li><a href="http://www.fwolf.com/blog/post/443" title="配置安全的共享web服务器（抛砖引玉） (2009-06-09)">配置安全的共享web服务器（抛砖引玉）</a> (4)</li>
	<li><a href="http://www.fwolf.com/blog/post/400" title="选择Eclipse PHP Development Tools(PDT)作为PHP开发工具 (2008-05-03)">选择Eclipse PHP Development Tools(PDT)作为PHP开发工具</a> (8)</li>
	<li><a href="http://www.fwolf.com/blog/post/176" title="让phpmailer支持中文名称的附件 (2006-05-23)">让phpmailer支持中文名称的附件</a> (5)</li>
	<li><a href="http://www.fwolf.com/blog/post/155" title="终于能够通过phpmailer使用gmail账号发送邮件了 (2006-04-14)">终于能够通过phpmailer使用gmail账号发送邮件了</a> (50)</li>
</ul>

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