摘要:针对短信接收方需要确定短信发送方的身份, 系统应用非对称式加密算法RSA与消息摘要算法SHA-1相结合的签名算法、数字证书等技术进行身份来源的认证。首先研究了两种算法:RSA加密算法, SHA-1算法, 然后利用数字签名以及数字证书对短信发送方的身份进行认证的系统设计, 系统主要由本地电脑的数字证书、Web服务器、Android客户端组成。本地电脑生成自签名证书并经CA机构认证, Android客户端采用http协议通信方式向Web服务器发出请求, Web服务器接受请求后获取数字证书私钥、公钥, 并返回给客户端。客户端利用接收到的私钥加密短信, 并发送给接收方。接收方利用与私钥匹配的公钥对加密的短信解密, 最后在Android手机平台以及本地tomcat服务器实现了该技术, 对短信来源身份认证的问题具有很大应用价值。
关键词:RSA算法; 短信的身份识别; 数字签名; 数字证书; 短信;
Abstract:The receiver of SMS needs to determine the identity of the sender of the SMS. The system used the signature algorithm combined with RSA and SHA-1 and the digital certificate to authenticate the identity source. Firstly, we studied two kinds of algorithms: RSA encryption algorithm and SHA-1 algorithm, and then used the digital signature and digital certificate to authenticate the identity of the sender. The system mainly consisted of the local computer 's digital certificate, web server and Android client. The local computer generated a self-signed certificate and was certified by a CA agency. The Android client sent a request to the web server by using an http protocol. The web server obtained the digital certificate private key and public key from the request and returned it to the client. The client used the received private key to encrypt the message and sent it to the recipient. The receiver decrypted the encrypted message using the public key matching the private key. Finally, this technology was implemented on the Android mobile platform and the local tomcat server, which had great application value for the authentication of the SMS source identity.
Keyword:RSA algorithm; Short message identification; Digital signature; Digital certificate; SMS;
近几年基于Android系统的智能手机的广泛普及, 同时短信资费的降低, 短信业务与此同时在上涨, 特别是短信在朋友与朋友联系, 通信商与客户, 银行与客户之间的业务沟通占据很大的一部分。但是与此同时电信诈骗分子利用短信来实施诈骗、利用伪基站扮演10086及银行官方电话发送诈骗短信, 并且诈骗短信信息包含网站链接, 点击链接很可能导致手机木马病毒的下载。基于此现状, 必须要确认短信发送方的真实身份之后才能确认短信的真假性, 因此必须提供一种身份认证技术, 即采用数字证书, 以及RSA加解密等相结合的技术。数字证书含有用户的个人信息。该技术必须具有的功能是接收方能够核实确认短信发送方的身份, 并且能够事后追查短信发送方的身份。
本文研究了RSA算法, SHA-1算法, 再对数字签名, 数字证书相关技术进行分析, 最后利用相关算法, 数字证书相结合的方式设计系统并应用到Android平台短信身份认证上。最后在Android手机平台以及服务器上采用Java语言实现在短信认证的相关技术, 最后实现了短信发送方的真实身份认证。
1、数字签名相关算法
甲方向乙方通过网络发送消息, 甲方首先对消息进行处理得到一个附带的“签名”消息并发送给乙方, 乙方通过相关算法验证签名的真伪及鉴别相应的签名者, 数字签名原理之一:私钥对消息加密, 接受者利用匹配的公钥解密即采用非对称式加解密算法。这就是非对称密码体制, 非对称密码体制不同于对称密码体制, 对称密码体制密钥与公钥相同, 非对称密码体制私钥与公钥不相同, 私钥与公钥是一对, 用私钥 (公钥) 加密, 必须用相应的公钥 (私钥) 来解密。数字签名算法包含了消息摘要算法和非对称式加密算法, 是网络安全机制以及数字证书的基础之一, 并且数字签名算法具有认证信息来源, 抗否认的作用。数字签名算法遵循利用私钥对信息签名, 利用公钥对信息验证, 签名需要私钥和待签信息, 验证利用公钥和签名信息[3]。
数字签名算法主要包括DSA、RSA、ECDSA算法, 其中RSA算法是数字签名算法中的经典, 该算法在Java语言中是完全支持的, 并且提供了实现加密, 解密的类函数, 能够用Java来实现该算法。RSA签名算法主要有MD系列和SHA系列, MD系列包含MD2with RSA, MD3with RSA签名算法, SHA系列包含SHA1with RSA, SHA512with RSA等算法[6]。
1.1、数字签名算法—RSA
算法1非对称式加密算法RSA具有比较高的安全性是源于整数因子分解困难性。RSA加密算法是非对称式加密算法中比较经典的算法, 具有高的可靠性、安全性, 在商业应用上具有广泛性。RSA加密算法不同于对称式加密算法中私钥与公钥相同, 它的私钥与公钥是不相同。RSA加密算法数学原理描述如下:
(1) 选定两个不同大的素数p和q, p和q私有, 不对外公布。
(2) 计算n=pq (可以公开) , & (n) = (p-1) (q-1) (私有, 不对外公布) ;
(3) 任意选取一个与& (n) 互素的整数e, 得到公钥 (e, n) ;
(4) 通过de=1 (mod& (n) ) 公式求得d, 得到私钥 (d, n) (必须保密) ;
⑤对消息m加密算法为c=E (m) =me (mod n) ;
(6) 对已加密的消息c解密算法为m=D (c) =cd (mod n) [1]。
1.2、数字签名算法—SHA-1
算法2 SHA-1算法属于SHA系列, Hash函数应用广泛包括两个重要分支系列即SHA系列, MD系列。Hash函数在密码学应用中占据举足轻重的位置, 它在消息认证、身份认证、电子签名等诸多邻域有相关应用。这里主要对Hash函数中SHA-1做相关介绍。SHA-1算法是SHA-0算法的改进版, 在商业应用很广。SHA-1算法中的重要的函数:
式中:x∧y, x⊕y分别表示x, y按位进行AND, XOR运算, ﹁x表示x按位进行取反运算[5]。
SHA-1算法首先对信息进行预处理, 预处理原理是将信息添加若干bit的0或1后分成512 bit的信息组。这样, 被处理之后的信息长度就为512的倍数[5]。
2、数字证书
数字证书应用了密码学中的消息摘要算法、非对称式加密算法、数字签名算法多种算法。消息摘要算法验证数据的完整性, 非对称式加密算法用于数据保密性, 数字签名算法用于抗否认性, 可鉴别消息来源。同时数字证书包含用户个人信息, 从而具有识别身份的作用。
获得数字证书, 需要通过使用数字证书管理工具如Keytool, 它是Java自带的用于存储密钥, 数字证书的管理工具, 主要应用在申请、导入、导出和撤销数字证书方面。Keytool与本机密钥库相连, 通过本机的命令行创建自签名的数字证书, 在创建之前先下载安装jdk, 其中Keytool位于%JDK_HOME%\bin。通过本地在密钥库中生成本地自签名的数字证书, 建立相应的加密算法、密钥、以及用户自身提供的信息。构建的自签名数字证书需要第三方CA机构认证, 只有认证后的数字证书才具有法律效力。经CA机构认证的证书通过相关工具导入本地密钥库和信任库[6]。生成数字证书的流程图如图1所示。
图1 数字证书生成
3、系统总体设计方案
首先通过DOS界面执行相关命令生成密钥库和自签名证书, 并将本地生成的自签名证书并导入第三方权威数字证书认证机构进行认证, 密钥库Keystore和数字证书导入本地。本方案采用非对程式加密算法为RSA算法, 签名算法为SHA-1with RSA算法, 消息摘要算法为SHA-1算法, 私钥加密, 公钥解密。用户A首先自主设计短信信息, 然后使用APP向本地部署的Tomcat服务器发出请求, 服务器会获取到本地密钥库中的私钥和数字证书中的公钥, 并将私钥返回给用户A客户端后台, 公钥发送给A所要发送短信的接收方 (客户端B) , 客户端后台对要发送的信息进行加密并发送给对方B, 同时接收方B对接收到短信利用之前接收到的公钥进行解密。设计方案图如图2所示。
图2 系统设计框架图
4、系统主要模块设计
4.1、客户端APP软件模块
该模块的作用是对短信信息的处理, 包括请求服务器获取私钥、发送公钥、加密短信、解密短信、发送短信等。主要分为短信加密发送模块和短信接收解密模块两大模块。
获取私钥函数模块其主要功能:客户端采用http协议方式请求服务器端, 服务器获取本地密钥库中私钥和公钥并返回给客户端后台。http协议是Android手机网络常用协议之一, http协议的传输特点:请求访问基于应用接口简单, 容错性强, 支持B/S及C/S两种应用模式, 可以传输任意类型的数据对象。客户端向服务器发出请求时, 通过post和get方式以及相关路径和方法获取数据。请求函数如下:
此函数模块功能通过url实例化请求, 客户端向服务器端发出请求并建立连接, url括号里的字符是建立请求连接的路径, http.connect () 函数就是建立连接。
建立请求连接后, 服务器获取本地私钥公钥返回给客户端, 客户端读取服务器返回的私钥和公钥, 读取字符流函数如下:
客户端获取私钥后, 利用私钥对短信信息进行加密处理, Android系统基于Java语言, Java中的API支持多种加密算法, 其中的Cipher类支持构建RSA非对称式加密算法, Certificate类用于数字证书的操作。
PKCS8Encoded Key pkcs8Key Spec=ne PKCS8 Encoded Key Spec (byte_privatekey) , byte_privatekey是获取服务器返回Json格式的私钥字符串转化为byte字节的数据。Private Key private Key=key Factory.generate Private (pkcs8Key Spec) ;主要生成私钥。cipher.init (Cipher.ENCRYPT_MODE, private Key) ;cipher.do Final (data) ;主要初始化cipher类, 并对数据加密处理。data就是待加密的信息数据。
发送已加密的短信模块:主要利用Sms Manager类, Sms Manager是Android提供常见的服务, 主要管理短信操作。通过Sms Manager类的相关方法将已经加密的信息发送给对方, 该模块通过调用该服务相关函数:Pending Intent pa Intent=Pending Intent.get Broadcast (Send Activity.this, 0, new Intent (“SMS_SENT”) , θ) , 该函数首先创建pa Intent对象, Intent (“SMS_SENT”) 及时启动短信发送功能, Pending Intent处理将要发生的事务, 利用get Broadcast广播将短信发送模块, patentsms Manager.divide Message (content2) , 主要将短信字符过长时将其分割短信再发送sms Manager.send T-ext Message () ;将其电话, 短信内容, 触发事务封装, 利用sms Manager服务将短信内容发送出去。
接受短信并显示模块函数:此函数主要将接收到的短信显示出, Uri uri=Uri.parse (SMS_URI_ALL) ;主要作用是读取短信信息cursor cur=get Content Resolver () .query (uri, projection, null, null, ″date desc″) ;获取手机内部短信。
解密接受的短信模块, 利用公钥对接受短信信息 (发送方已利用私钥对短信加密) 解密处理, Java支持解密处理, 自带相关解密类X509Encoded Key Spec x509Key Spec=new X509Encoded Key Spec (key) ;KeyFactory key Factory=Key Factory.get Instance (KEY_AL-GORITHM) ;Public Key public Key=key Factory.generate Public (x509Key Spec) ;key是获取公钥字符串转化为byte字节, public Key是生成公钥对象。cipher.init (Cipher.DECRYPT_MODE, public Key) ;是初始cipher类并指定解密模式, cipher.do Final (data) 是生成解密信息, data是待解密信息。
4.2、服务器端Tomcat模块
该模块主要采用Tomcat服务器, Tomcat服务器有几个主要应用:Web服务器和jsp容器以及servlet容器。通过URL地址访问的方式, 客户端访问请求Web服务器中的资源, 把接收到的http请求封装成Request对象, 本模块的实现通过实现servlet接口, 每一次客户端请求访问servlet, 获取到Response对象。服务器端模块实现的功能包括:接受请求、获取密钥、返回请求。服务器端各模块关系如图3所示。
获取密钥 (公钥和私钥) 模块:获取密钥库私钥, 首先加载密钥库文件到服务器中, 再从密钥库中获取私钥, 数字证书中获取公钥。File Input Stream in=new File Input Stream (″c:/users/Administrator/ael.keystore″) ;该函数用于加载ael.keystore密钥库, Private Key private Key= (Private Key) ks.get Key (alias, password.toChar Array () ) ;该函数从密钥库文件中获取私钥。Certificate cert=ks.get Certificate (alias) ;Public Key public K-ey=cert.get Public Key () , 主要从证书中获取公钥。
返回请求模块:该模块主要是返回给客户端相关请求的数据 (私钥和公钥) , 该模块功能主要是将获取的私钥和公钥封装成Json格式的数据返回给客户端。相关函数如下:
5、系统测试软件界面
该系统测试主要包括Web服务器启动, APP获取服务器密钥, APP加密短信, 发送短信, 解密短信。连接Wifi, 点击APP后进入界面包含三个功能按钮, 点击“进入加密发送界面”之后, 输入相关信息, 点击“加密发送”按钮, 后台获取服务器私钥, 公钥, 并利用私钥加密短信, 最后发送给对方。点击“发送公钥”, 接受方利用公钥解密已加密短信。
6、结语
本文围绕短信信息识别进行系统设计, 包括相关算法研究与应用、模块功能设计, 一定程度到达识别短信发送方身份目的。10086、银行发送短信应用此设计方法具有重大价值, 但有诸多不足。同时, 防止犯罪分子冒充10086、银行官网电话以及好友电话发送短信实施诈骗, 还必须加强社会各个层面的监管。本文的相关研究与应用, 特别是RSA算法以及数字证书在短信身份认证应用上将会越来越受到重视。
参考文献
[1]蒙峭缘.非对称密码算法RSA及其用JAVA2的实现[J].玉林师范学院学报, 2006, 27 (5) :153-157.
[2]郭霖霖.第一行代码Android[M].人民邮电出版社, 2014.
[3]赵小明, 章美仁.RSA数字签名技术在电子公文流转中的应用[J].计算机工程与设计, 2005, 26 (5) :1214-1216.
[4]李龙景, 杨琪.基于RSA的多元非对称密码系统在数字签名中的应用[J].吉林大学学报:理学版, 2002, 40 (2) :165-167.
[5]李世明.关于Hash算法SHA-1的研究与分析[D].西南大学, 2013.
[6]梁栋.Java加密与解密的艺术[M].北京:机械工业出版社, 2014.