胡先祥 曹 斌
(貴州大學大數據與信息工程學院 貴州 貴陽 550000)
近幾年基于Android系統的智能手機的廣泛普及,同時短信資費的降低,短信業務與此同時在上漲,特別是短信在朋友與朋友聯系,通信商與客戶,銀行與客戶之間的業務溝通占據很大的一部分。但是與此同時電信詐騙分子利用短信來實施詐騙、利用偽基站扮演10086及銀行官方電話發送詐騙短信,并且詐騙短信信息包含網站鏈接,點擊鏈接很可能導致手機木馬病毒的下載?;诖爽F狀,必須要確認短信發送方的真實身份之后才能確認短信的真假性,因此必須提供一種身份認證技術,即采用數字證書,以及RSA加解密等相結合的技術。數字證書含有用戶的個人信息。該技術必須具有的功能是接收方能夠核實確認短信發送方的身份,并且能夠事后追查短信發送方的身份。
本文研究了RSA算法,SHA-1算法,再對數字簽名,數字證書相關技術進行分析,最后利用相關算法,數字證書相結合的方式設計系統并應用到Android平臺短信身份認證上。最后在Android手機平臺以及服務器上采用Java語言實現在短信認證的相關技術,最后實現了短信發送方的真實身份認證。
甲方向乙方通過網絡發送消息,甲方首先對消息進行處理得到一個附帶的“簽名”消息并發送給乙方,乙方通過相關算法驗證簽名的真偽及鑒別相應的簽名者,數字簽名原理之一:私鑰對消息加密,接受者利用匹配的公鑰解密即采用非對稱式加解密算法。這就是非對稱密碼體制,非對稱密碼體制不同于對稱密碼體制,對稱密碼體制密鑰與公鑰相同,非對稱密碼體制私鑰與公鑰不相同,私鑰與公鑰是一對,用私鑰(公鑰)加密,必須用相應的公鑰(私鑰)來解密。數字簽名算法包含了消息摘要算法和非對稱式加密算法,是網絡安全機制以及數字證書的基礎之一,并且數字簽名算法具有認證信息來源,抗否認的作用。數字簽名算法遵循利用私鑰對信息簽名,利用公鑰對信息驗證,簽名需要私鑰和待簽信息,驗證利用公鑰和簽名信息[3]。
數字簽名算法主要包括DSA、RSA、ECDSA算法,其中RSA算法是數字簽名算法中的經典,該算法在Java語言中是完全支持的,并且提供了實現加密,解密的類函數,能夠用Java來實現該算法。RSA簽名算法主要有MD系列和SHA系列,MD系列包含MD2withRSA, MD3withRSA簽名算法,SHA系列包含SHA1withRSA,SHA512withRSA等算法[6]。
算法1非對稱式加密算法RSA具有比較高的安全性是源于整數因子分解困難性。RSA加密算法是非對稱式加密算法中比較經典的算法,具有高的可靠性、安全性,在商業應用上具有廣泛性。RSA加密算法不同于對稱式加密算法中私鑰與公鑰相同,它的私鑰與公鑰是不相同。RSA加密算法數學原理描述如下:
① 選定兩個不同大的素數p和q,p和q私有,不對外公布。
② 計算n=pq(可以公開),&(n)=(p-1)(q-1)(私有,不對外公布);
③ 任意選取一個與&(n)互素的整數e,得到公鑰(e,n);
④ 通過de=1(mod&(n))公式求得d,得到私鑰(d,n)(必須保密);
⑤ 對消息m加密算法為c=E(m)=me(modn);
⑥ 對已加密的消息c解密算法為m=D(c)=cd(modn)[1]。
算法2SHA-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]。
數字證書應用了密碼學中的消息摘要算法、非對稱式加密算法、數字簽名算法多種算法。消息摘要算法驗證數據的完整性,非對稱式加密算法用于數據保密性,數字簽名算法用于抗否認性,可鑒別消息來源。同時數字證書包含用戶個人信息,從而具有識別身份的作用。
獲得數字證書,需要通過使用數字證書管理工具如Keytool,它是Java自帶的用于存儲密鑰,數字證書的管理工具,主要應用在申請、導入、導出和撤銷數字證書方面。Keytool與本機密鑰庫相連,通過本機的命令行創建自簽名的數字證書,在創建之前先下載安裝jdk,其中Keytool位于%JDK_HOME%in。通過本地在密鑰庫中生成本地自簽名的數字證書,建立相應的加密算法、密鑰、以及用戶自身提供的信息。構建的自簽名數字證書需要第三方CA機構認證,只有認證后的數字證書才具有法律效力。經CA機構認證的證書通過相關工具導入本地密鑰庫和信任庫[6]。生成數字證書的流程圖如圖1所示。

圖1 數字證書生成
首先通過DOS界面執行相關命令生成密鑰庫和自簽名證書,并將本地生成的自簽名證書并導入第三方權威數字證書認證機構進行認證,密鑰庫Keystore和數字證書導入本地。本方案采用非對程式加密算法為RSA算法,簽名算法為SHA-1withRSA算法,消息摘要算法為SHA-1算法,私鑰加密,公鑰解密。用戶A首先自主設計短信信息,然后使用APP向本地部署的Tomcat服務器發出請求,服務器會獲取到本地密鑰庫中的私鑰和數字證書中的公鑰,并將私鑰返回給用戶A客戶端后臺,公鑰發送給A所要發送短信的接收方(客戶端B),客戶端后臺對要發送的信息進行加密并發送給對方B,同時接收方B對接收到短信利用之前接收到的公鑰進行解密。設計方案圖如圖2所示。

圖2 系統設計框架圖
該模塊的作用是對短信信息的處理,包括請求服務器獲取私鑰、發送公鑰、加密短信、解密短信、發送短信等。主要分為短信加密發送模塊和短信接收解密模塊兩大模塊。
獲取私鑰函數模塊其主要功能:客戶端采用http協議方式請求服務器端,服務器獲取本地密鑰庫中私鑰和公鑰并返回給客戶端后臺。http協議是Android手機網絡常用協議之一,http協議的傳輸特點:請求訪問基于應用接口簡單,容錯性強,支持B/S及C/S兩種應用模式,可以傳輸任意類型的數據對象??蛻舳讼蚍掌靼l出請求時,通過post和get方式以及相關路徑和方法獲取數據。請求函數如下:
URLurl=new URL(″http://192.168.0.145:8080/servlet/Cerficate″);HttpURLConnection http=(HttpURLConnection)url.openConnection();http.connect();
此函數模塊功能通過url實例化請求,客戶端向服務器端發出請求并建立連接,url括號里的字符是建立請求連接的路徑,http.connect()函數就是建立連接。
建立請求連接后,服務器獲取本地私鑰公鑰返回給客戶端,客戶端讀取服務器返回的私鑰和公鑰,讀取字符流函數如下:
InputStream
is=http.getInputStream();
InputStreamReader isr=new InputStreamReader(is);
BufferedReader br=new BufferedReader(isr);
Userjson=br.readline();
客戶端獲取私鑰后,利用私鑰對短信信息進行加密處理,Android系統基于Java語言,Java中的API支持多種加密算法,其中的Cipher類支持構建RSA非對稱式加密算法,Certificate類用于數字證書的操作。
PKCS8EncodedKey pkcs8KeySpec=nePKCS8 EncodedKeySpec(byte_privatekey), byte_privatekey是獲取服務器返回Json格式的私鑰字符串轉化為byte字節的數據。PrivateKey privateKey=keyFactory.generatePrivate(pkcs8KeySpec); 主要生成私鑰。cipher.init(Cipher.ENCRYPT_MODE, privateKey); cipher.doFinal(data);主要初始化cipher類,并對數據加密處理。data就是待加密的信息數據。
發送已加密的短信模塊:主要利用SmsManager類,SmsManager是Android提供常見的服務,主要管理短信操作。通過SmsManager類的相關方法將已經加密的信息發送給對方,該模塊通過調用該服務相關函數:PendingIntent paIntent = PendingIntent.getBroadcast(SendActivity.this,0,new Intent(“SMS_SENT”),θ),該函數首先創建paIntent對象,Intent(“SMS_SENT”)及時啟動短信發送功能,PendingIntent處理將要發生的事務,利用getBroadcast廣播將短信發送模塊,patentsmsManager.divideMessage(content2),主要將短信字符過長時將其分割短信再發送smsManager.sendTextMessage();將其電話,短信內容,觸發事務封裝,利用smsManager服務將短信內容發送出去。
接受短信并顯示模塊函數:此函數主要將接收到的短信顯示出,Uri uri = Uri.parse(SMS_URI_ALL);主要作用是讀取短信信息cursor cur= getContentResolver().query(uri, projection,null,null, ″date desc″); 獲取手機內部短信。
解密接受的短信模塊,利用公鑰對接受短信信息(發送方已利用私鑰對短信加密)解密處理,Java支持解密處理,自帶相關解密類X509EncodedKeySpec x509KeySpec=new X509EncodedKeySpec(key);KeyFactory keyFactory=KeyFactory.getInstance(KEY_ALGORITHM);PublicKey publicKey=keyFactory.generatePublic(x509KeySpec);key是獲取公鑰字符串轉化為byte字節,publicKey是生成公鑰對象。cipher.init(Cipher.DECRYPT_MODE, publicKey);是初始cipher類并指定解密模式,cipher.doFinal(data)是生成解密信息,data是待解密信息。
該模塊主要采用Tomcat服務器,Tomcat服務器有幾個主要應用:Web服務器和jsp容器以及servlet容器。通過URL地址訪問的方式,客戶端訪問請求Web服務器中的資源,把接收到的http請求封裝成Request對象,本模塊的實現通過實現servlet接口,每一次客戶端請求訪問servlet,獲取到Response對象。服務器端模塊實現的功能包括:接受請求、獲取密鑰、返回請求。服務器端各模塊關系如圖3所示。

圖3 服務器端模塊
獲取密鑰(公鑰和私鑰)模塊:獲取密鑰庫私鑰,首先加載密鑰庫文件到服務器中,再從密鑰庫中獲取私鑰,數字證書中獲取公鑰。FileInputStream in = new FileInputStream(″c:/users/Administrator/ael.keystore″);該函數用于加載ael.keystore密鑰庫,PrivateKey privateKey=(PrivateKey)ks.getKey(alias, password.toCharArray());該函數從密鑰庫文件中獲取私鑰。Certificate cert=ks.getCertificate(alias);PublicKey publicKey= cert.getPublicKey(),主要從證書中獲取公鑰。
返回請求模塊:該模塊主要是返回給客戶端相關請求的數據(私鑰和公鑰),該模塊功能主要是將獲取的私鑰和公鑰封裝成Json格式的數據返回給客戶端。相關函數如下:
jsonObject.put(″privatekey″,user.getPrivatekey());jsonObject.put(″publickey″,user.getPublickey());jsonArray.put(jsonObject);
response.getWriter().println(jsonArray.toString());
該系統測試主要包括Web服務器啟動,APP獲取服務器密鑰,APP加密短信,發送短信,解密短信。連接Wifi,點擊APP后進入界面包含三個功能按鈕,點擊“進入加密發送界面”之后,輸入相關信息,點擊“加密發送”按鈕,后臺獲取服務器私鑰,公鑰,并利用私鑰加密短信,最后發送給對方。點擊“發送公鑰”,接受方利用公鑰解密已加密短信。
本文圍繞短信信息識別進行系統設計,包括相關算法研究與應用、模塊功能設計,一定程度到達識別短信發送方身份目的。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.
[7] Phillips B J,Burgess N.Implementing 1,024-Bit RSA Exponentiation on a 32-Bit Processor Core[C]//Application-Specific Systems,Architectures,and Processors,2000.Proceedings.IEEE International Conference on.IEEE,2002:127.
[8] Islam S K H,Biswas G P.Provably secure and pairing-free certificateless digital signature scheme using elliptic curve cryptography[J].International Journal of Computer Mathematics,2013,90(11):2244-2258.
[9] Janagan M,Devanathan M.Area compactness architecture for eliptic curve ography[C]//2012 nternational Conference on Pattern Recognition,ngineering(PRIME),USA:Hawaii,2012:131-134.