基于Linux下数字签名技术的实现
2019-06-17余立强
余立强
摘要:运用非对称密钥加密技术与数字摘要技术描绘出数字签名技术的工作原理图,使用Linux系统中的shell命令实现数字签名技术中的创建私钥、导出公钥、私钥签名、公钥校验等实践操作,很好地展现了数字签名技术实践应用的可操作性。
关键词:Linux;数字签名技术;私钥;公钥
中图分类号:G642.0 文献标志码:A 文章编号:1674-9324(2019)19-0103-02
数字签名是一种电子签章,类似写在纸上的普通的物理签名,在电子商务、电子政务等各类项目中得到广泛的应用。
一、基本概念
数字签名技术由非对称密钥加密技术与数字摘要技术构成,用于文件完整性验证,具有不可抵赖性。数字签名只有信息的发送者才能产生、别人无法伪造的一串数字,这些数字同时也是对信息的发送者发送信息真实性的一个有效证明。
数字签名技术工作原理如图1所示。
在图1中,发送方利用RSA加密算法创建私钥,对原文用Hash算法得到信息摘要,输出固定长度的哈希值。对信息摘要用私钥和RAS加密算法进行加密得到数字签名。发送方利用私钥导出公钥,然后将数字签名、原文和数字签名三个文件发送给接收方。
接收方首先用与发送方一样的哈希函数对接收到的原文计算出信息摘要,再用接收到的公钥对数字签名文件进行解密,也得到一个信息摘要,然后判断这两个摘要是否相同,若相同,则接收方确认该数字签名是发送方的,原文也是无篡改的。反之,则数字签名不可信,或原文有篡改。
二、Linux系统环境
(一)操作环境
在宿主机上安装VMware虚拟机软件,准备1台或2台安装CentOS 6.5版本以上的Linux系统的虚拟机。
(二)数字签名操作
在Linux系统opensll命令可实现4种非对称加密算法,包括DH、RSA、DSA和椭圆曲线算法(EC)。RSA算法既可以用于密钥交换,也可以用于数字签名。
OpenSSL实现了5种信息摘要算法,分别是MD2、MD5、MDC2、SHA(SHA1)和RIPEMD。这里主要用SHA信息摘要算法。
三、数字签名操作过程
进入Linux系统进行操作:
(一)编辑原文件file.txt
创建原文件file.txt,可以是任意类型的文件,这里仅作演示,输入命令:
#echo “This is a digital signature example.”>file.txt
(二)创建私钥key.pri
1.创建私钥。
#openssl genrsa –out key.pri –f4 2048
RSA加密算法产生的2048位私钥,并使用F4作为公钥的E参数,将私钥保存在文件key.pri中。
2.查看私钥。
#openssl rsa –inform PEM –in key.pri –text
以PEM格式显示私钥的明文输出密钥参数。
(三)导出公钥key.pub
1.导出公钥。
#openssl rsa –inform PEM –outform PEM –in key.pri –out key.pub –pubout
用rsa的私钥文件key.pri导出PEM格式的公钥,保存在文件key.pub中。
2.查看公钥。
#cat key.pub
或查看公钥命令:
#openssl rsa –inform PEM –in key.pub –pubin –text
以PEM格式显示公钥的明文输出密钥参数,得到与上面查看私钥类似的显示。
(四)私钥签名
1.方法1。参见图1,进行私钥签名操作:
(1)计算原文件的信息摘要。
#openssl dgst –sha256 –binary –out file1.sha256 file.txt
将原文件的信息摘要(hash值)保存在文件file1.sha256中。
(2)用私钥key.pri签名。
#openssl rsautl -out file1.sig –sign –inkey key.pri –in file1.sha256
用私钥对信息摘要进行非对称加密算法加密签名,产生签名文件file1.sig。
2.方法2。对上面方法1的合成操作命令:
#openssl dgst –sha256 –out file2.sig –sign key.pri –keyform PEM file.txt
产生签名文件file2.sig,并查看签名文件file2.sig:
#od –v –An –t x1 file2.sig
注意,file1.sig與file2.sig的内容是不相同的。
(五)公钥校验
发送者将原文件file.txt、公钥文件key.pub和签名文件file.sig传输给接收者,接收者模拟验证操作。
与私钥签名相对应,接收者的公钥校验的二种方法如下。
1.方法1。对照图1,接收方校验信息摘要的操作:
(1)由签名文件计算信息摘要。
#openssl rsautl –out file2.rec –inkey key.pub –in file1.sig –pubin –verify
用公钥解密收到的签名文件file1.sig的hash值,即原文件file.txt的信息摘要(hash值),将结果保存到二进制文件file2.rec中。
(2)查看file2.rec文件中的信息摘要。
#od –v –An –t x1 file2.rec
(3)计算接收到的原文件file.txt的信息摘要。
#openssl dgst –sha256 –binary –out file2.sha256 file.txt
在接收方计算收到的原文件file.txt的hash值,即信息摘要保存到文件file2.sha256中。
(4)查看file2.sha256的内容。
#od –v –An –t x1 file2.sha256
比较file2.sha256文件与file2.rec文件中32个字节的内容是完全一致的,即信息摘要是相同的,可以确认接收到的原文件file.txt是无篡改、可信的。反之,则说明接收到的文件有篡改或不可信的。
2.方法2。对应私钥签名方法2,用下面的命令进行公钥校验:
#openssl dgst –sha256 –keyform PEM –verify key.pub –signature file2.sig file.txt
若显示:Verified OK
则表示用公钥校验签名文件是正常的,即接收到的原文件是无篡改和可信的。
若显示:Verification Failure
则表示接收到的文件有篡改或不可信的。
四、小结
在shell状态下用openssl命令实现数字签名技术的操作有助于对其工作原理的理解,方法1对应图1所示的工作原理,方法2是图1的合成命令操作,在实际操作中更快、更有效。
参考文献:
[1]鲁立,计算机网络安全[M].机械工业出版社,2018,(01).
[2]百度.数字签名[EB/OL].https://baike.baidu.com/item/数字签名/212550?fr=aladdin
[3]百度.linux平臺数字签名实现无示例[EB/OL].https://jingyan.baidu.com/article/6181c3e06a920f152ff1536e.html.