如何保护我们自己的firmware的知识产权(适用于嵌入式开发)

http://blog.chinaunix.net/u/22617/showart_267324.html

我们在商业开发常常碰到这样的问题需要解决:

1> 在我们的商业开发中,我们需要加密保护我们发布的firmware , 不让竞争对手,甚至客户看到firmware的实际内容。 2> 用户在我们公司网站上download到一版firmware后, 如何知道这就是一个可以信任的firmware 呢? 或者说如何保证就是我们公司的firmware呢?而不是别人假冒的呢? (一旦别人假冒的话, 万一upgrade到自己的开发板子里面岂不是就瘫痪了(当然我们的upgrade的程序会进行判断的,不会发生那样的事情) 关于如何加密我们的bin file ,以确保不会被别人看到实际的内容。



为此, 我专门到google上搜索到 了两个软件 , 一个是 mcrypt ,另外就是 gpg 。
mcrypt 功能强大, 最适合用来加密linux下面的文件。

1>   mcrypt , 他是UNIX上 crypt(1)的替代版本,
功能更强大, 支持的算法更多 。 而且可逆(这才是最重要的)
crypt(1) 因为美国的限制 ,而不能出口到别的国家, 因而有了mcrypt 。 我已经
porting到arm板子上来。 总共需要3个软件包。

它的用法如下: 比如 我们已经有了 file.tgz
加密: mcrypt file.tgz
    输入密码: 12345
   确认:     12345
OK .......... 生成 file.tgz.nc

解密: mcrypt -d file.tgz.nc
输入密码:12345
OK .............


需要的软件包:

mcrypt 和 libmcrypt
http://sourceforge.net/project/showfiles.php?group_id=87941
Note: libmcrypt用2.5.8 (当前最新的) , mcrypt用2.6.4, 不要最新的2.6.5在
Redhat和Fedora上面configure之后无法生成config.h 导致make有问题, 2.6.4就
ok,没有这个问题。

另外还需要mhash的软件
包: http://sourceforge.net/project/showfiles.php?group_id=4286&package_id=4300&release_id=487956
目前的版本好:0.9.8.1 在实际操作中, 我们的产品提供一个web页面, 其中就有一个upgrade的界面, 后台有cgi的支持, 当然cgi里面的解密的密码是事先约定好的。 比如就是12345 。 当用户点击upgrade 按钮的时候 , 我们会把用户的firmware upload到板子上去,然后,用这个约定的密码进行解密,如果无法解密说明就不是我们公司发布的firmware,就会放弃当前的upgrade 操作, 并提示用户check这个firmware来源是否可靠,并联系我们公司的销售人员! 2> 要解决第二个问题就要利用数字签名的功能了: 但是我觉得PGP 对于改善我们的整个的firmware的版本发布,好处是巨大的。
比如 ,我们可以用pgp ,对每个发布的版本都用我们公司的 private key 进
行签名加密。 我们可以把我们的public key 放在网上,供用户下载,用户拿到我们
的firmware 后, 用我们公司的的public key 对其进行解密 ,因为只有public key才可
以解密成功, 这就说明了, 用户拿到的firmware一定是我们Sercomm自己发布的,否
则就不是。 下面是在pc上试验的结果: 对于 ,文件签名我只是在PC上试验了一下, 还不错, 因为有个文件使用汇编写的,
我不熟悉汇编, 所以没有成功porting到arm板子上去试验。


GPG即GNU Privacy Guard,它是加密工具PGP(Pretty Good Privacy )的非商业化版
本,用于对Email、文件及其他数据的收发进行加密与验证,确保通信数据的可靠性和
真实性。本文将对GPG技术及相关工具进行介绍,旨在帮助网上冲浪者之间“真诚”交
流。


用免费GPG加密收发Email
http://netsecurity.51cto.com/art/200512/15011.htm

如何应用GPG加密使您的信息安全保障无忧

http://www.qqread.com/encrypt/s660891062.html

使用GnuPG对文件进行加密

http://mambofan.net/html/content/3/view3037.html


下面是我在pc上试验的结果:


在bob 的pc上:
生成密钥:
gpg --gen-key

导出密钥:
gpg --export >bob.gpg 也可以加一个-a 参数以生成
ASCII 文件,而不是二进制的

然后发给对方(kate) , 可以利用ftp ,ssh等等。



Kate
导入bob的public key:
gpg --import bob.gpg

签名:
gpg --sign-key

此时, 如果bob用自己的private key 加密了一个文件。gpg --clearsign
mymessage.txt 会生成 mymessage.txt.asc


那么 kate如何解开呢?
$kate: gpg -d mymessage.txt.asc > mymessage.txt


---------现在kate 已经导入了 bob的 public key , 那么kate也可以加密数据,
只有bob能解开。 (用bob的public key加密 , 只有bob的private key能解开)

kate 加密: gpg -r -a --encrypt kate-bob.txt
然后, 会生成 kate-bob.txt.asc 文件 。


bob受到后, 解开: gpg -d kate-bob.txt.asc
输入自己的密码即可解开了。