余健
摘 要:針對(duì)物聯(lián)網(wǎng)安全課程《密碼學(xué)算法實(shí)驗(yàn)》教學(xué)中存在的問題,分析目前《密碼學(xué)算法實(shí)驗(yàn)》教學(xué)中采用的軟件所存在的弊病,提出以Python語(yǔ)言為實(shí)驗(yàn)編程工具的觀點(diǎn)。
關(guān)鍵詞:信息安全;密碼學(xué);Python;物聯(lián)網(wǎng)
中圖分類號(hào):TP393 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):2095-1302(2018)07-0-03
0 引 言
密碼學(xué)算法是物聯(lián)網(wǎng)安全等信息安全課程教學(xué)的基礎(chǔ)[1]。密碼學(xué)算法的教學(xué)效果直接影響到學(xué)生對(duì)物聯(lián)網(wǎng)安全課程的掌握程度。目前密碼學(xué)算法的實(shí)驗(yàn)教學(xué)采用現(xiàn)成的密碼學(xué)算法軟件演示[2],或采用C,C++及Matlab等編程實(shí)現(xiàn),但是密碼學(xué)算法軟件的演示只是使學(xué)生了解算法的最終結(jié)果,無(wú)法使學(xué)生理解算法原理;采用C,C++等高級(jí)語(yǔ)言編程實(shí)現(xiàn)密碼學(xué)算法,有利于學(xué)生掌握算法原理,但在實(shí)驗(yàn)教學(xué)當(dāng)中,學(xué)生普遍反映編程難度大,算法實(shí)現(xiàn)繁瑣等問題;而采用Matlab編程的優(yōu)點(diǎn)是編程語(yǔ)言簡(jiǎn)單、算法容易實(shí)現(xiàn),缺點(diǎn)是無(wú)法直接應(yīng)用于實(shí)際項(xiàng)目中。
因此,采用合適的編程語(yǔ)言對(duì)密碼學(xué)算法的實(shí)踐教學(xué)改革是極其重要的[3]。Python語(yǔ)言被稱為膠水語(yǔ)言[4],它具有Matlab語(yǔ)言的優(yōu)點(diǎn),并且應(yīng)用范圍廣,采用Python語(yǔ)言編程可直接應(yīng)用于各個(gè)領(lǐng)域[5]??紤]到Python語(yǔ)言的簡(jiǎn)單易用性,以及包含了大量的算法包,密碼學(xué)算法實(shí)驗(yàn)教學(xué)全部采用Python編程實(shí)現(xiàn)。這樣既能夠加深學(xué)生對(duì)密碼學(xué)算法的理解,提高學(xué)生的編程能力和應(yīng)用能力,也有利于學(xué)生編寫軟件參加學(xué)科競(jìng)賽及各種項(xiàng)目,提高學(xué)生的職業(yè)素養(yǎng)和職業(yè)能力。
密碼學(xué)算法實(shí)驗(yàn)主要包括古典密碼學(xué)實(shí)驗(yàn)、DES和AES對(duì)稱密碼學(xué)算法實(shí)驗(yàn)和RSA公鑰密碼學(xué)算法實(shí)驗(yàn)[6-8]。
1 古典密碼學(xué)實(shí)驗(yàn)
古典密碼學(xué)算法主要包括凱撒密碼、維吉尼亞密碼和Hill矩陣加密算法。采用Python語(yǔ)言編程實(shí)現(xiàn),以凱撒密碼為例,代碼如下所示:
def Encrypt(P,key)://加密函數(shù)
P = list(P)
P = map(ord,P)
import numpy as np
P = np.array(P)
P = P - ord(‘a(chǎn))
C =(P + key)%26
C = C + ord(‘A)
C = map(chr,C)
C = ‘.join(C)
return C
def Decrypt(C,key): //解密函數(shù)
C = list(C)
D = map(ord,C)
import numpy as np
D = np.array(D)
D = D-ord(‘A)
D =(D-key)%26
D = D + ord(‘a(chǎn))
D = map(chr,D)
D =‘.join(D)
return D
#主函數(shù)
user_input=raw_input(‘加密請(qǐng)按E,解密請(qǐng)按D:);
while(user_input!=‘E and user_input!=‘D):
//輸入合法性判斷
user_input=raw_input(‘輸入有誤!請(qǐng)重新輸入:)
key=raw_input(‘請(qǐng)輸入密鑰:)
while(int(key.isdigit()==0))://輸入合法性判斷
key=raw_input(‘輸入有誤!密鑰為數(shù)字,請(qǐng)重新輸入:)
if user_input==‘E://加密
P=raw_input(‘請(qǐng)輸入明文:)
C=Encrypt(P,int(key))
print ‘密文為:\n%s % C
else://解密
C=raw_input(‘請(qǐng)輸入密文:)
P=Decrypt(C,int(key))
print ‘明文為:\n%s % P
學(xué)生完成了凱撒密碼算法的實(shí)現(xiàn)之后,可讓在以上程序的基礎(chǔ)上,進(jìn)一步實(shí)現(xiàn)維吉尼亞密碼。
2 DES和AES對(duì)稱加密算法實(shí)驗(yàn)
數(shù)據(jù)加密標(biāo)準(zhǔn)(Data Encryption Standard,DES),除了被廣泛應(yīng)用于金融交易中,它還被嵌入到許多商業(yè)應(yīng)用中。1977年美國(guó)國(guó)家標(biāo)準(zhǔn)局正式公布實(shí)施了美國(guó)的數(shù)據(jù)加密標(biāo)準(zhǔn)(DES),公開了它的加密算法,并批準(zhǔn)用于非機(jī)密單位和商業(yè)上的保密通信。高級(jí)加密標(biāo)準(zhǔn)(Advanced Encryption Standard,AES)又稱為Rijndael加密法,是美國(guó)聯(lián)邦政府采用的一種區(qū)塊加密標(biāo)準(zhǔn)。該標(biāo)準(zhǔn)用來(lái)替代日益不安全的DES算法。
DES和AES算法的實(shí)現(xiàn)比較復(fù)雜,采用Python語(yǔ)言做實(shí)驗(yàn)時(shí),可以調(diào)用Crypto密碼學(xué)算法包的相關(guān)函數(shù)來(lái)實(shí)現(xiàn),具體的編程代碼如下所示:
# DES加密解密
from Crypto.Cipher import DES
from Crypto import Random
key =‘keyskeys//必須為8 B
plaintext = ‘計(jì)算機(jī)與信息工程
print ‘明文:,plaintext
cipher = DES.new(key,DES.MODE_ECB)
ciphertext = cipher.encrypt(plaintext)
print ‘密文:,ciphertext.encode(‘hex) //16進(jìn)制表示
decrypttext = cipher.decrypt(ciphertext)
print ‘解密結(jié)果:,decrypttext
# AES 加密解密
from Crypto.Cipher import AES
from binascii import b2a_hex,a2b_hex
from Crypto import Random
def encrypt(text,key,IV):
cryptor = AES.new(key,AES.MODE_CBC,IV)
length = 16
count = len(text)
add = length-(count% length)
text = text +(‘\0 * add)
ciphertext = cryptor.encrypt(text)
return b2a_hex(ciphertext)
def decrypt(text,key,IV):
cryptor = AES.new(key,AES.MODE_CBC,IV)
plain_text = cryptor.decrypt(a2b_hex(text))
return plain_text.rstrip(‘\0)//解密后,去掉補(bǔ)足的空格
key = ‘keyskeyskeyskeys
#初始化密鑰,密鑰長(zhǎng)度必須16,24或32 B長(zhǎng)
plaintext = ‘韓山師范學(xué)院
print ‘明文:,plaintext
IV = Random.new().read(AES.block_size)
//加密或解密的初始化向量
ciphertext = encrypt(plaintext,key,IV)
decrypttext = decrypt(ciphertext,key,IV)
print‘密文:,ciphertext
print‘解密結(jié)果:,decrypttext
在DES和AES對(duì)稱密碼算法實(shí)驗(yàn)中,要強(qiáng)調(diào)DES的密鑰必須為8 B,而AES的密鑰為16,24或32 B,DES的加密文本長(zhǎng)度必須為8 B的倍數(shù),而AES的加密文本長(zhǎng)度必須為16,24或32 B的倍數(shù)。
3 RSA公鑰密碼學(xué)算法實(shí)驗(yàn)
RSA公鑰密碼學(xué)算法廣泛應(yīng)用于信息安全領(lǐng)域,包括非對(duì)稱加密解密、認(rèn)證技術(shù)以及數(shù)字簽名等。RSA算法主要通過求乘法逆元、加密和解密函數(shù)實(shí)現(xiàn)。這三個(gè)函數(shù)的Python代碼如下所示:
def multip_inverse(e,fn):
A=0; B=1; m=fn;
b=e; Q=m/b; R=m%b;
while(R>1):
X=A-Q×B; A=B;
B=X; m=b; b=R;
Q=m/b; R=m%b;
if(R == 1):
X=A-Q×B
return X% fn
if(R == 0):
print ‘乘法逆元不存在!
return ‘none
def Encrypt(P,e,n)://加密函數(shù)
C =( P×e)%n//加密得出密文C
return C
def Decrypt(C,d,n)://解密函數(shù)
D =(C×d)%n//解密得出明文P
return D
另外,學(xué)生在完成RSA公鑰密碼學(xué)算法的基礎(chǔ)上,讓學(xué)生完成RSA數(shù)字簽名程序,進(jìn)一步提高學(xué)生的實(shí)踐能力。
4 結(jié) 語(yǔ)
通過以上示例,我們可以發(fā)現(xiàn),使用Python語(yǔ)言實(shí)現(xiàn)密碼學(xué)算法,簡(jiǎn)單易用,學(xué)生容易掌握,可降低使用高級(jí)語(yǔ)言編寫密碼學(xué)法的難度,又能提高學(xué)生的學(xué)習(xí)興趣。除了古典密碼學(xué)實(shí)驗(yàn),DES和AES對(duì)稱密碼學(xué)算法實(shí)驗(yàn)和RSA公鑰密碼學(xué)算法實(shí)驗(yàn),還可布置一些趣味密碼學(xué)問題,例如分別采用蠻力破解和字典攻擊方法破解壓縮文件密碼,破解無(wú)線WiFi密碼和破解谷哥瀏覽器登錄密碼等,提高學(xué)生對(duì)這些課程的學(xué)習(xí)興趣,增強(qiáng)實(shí)踐能力和應(yīng)用能力。通過在物聯(lián)網(wǎng)安全的實(shí)驗(yàn)教學(xué)中采用Python編程工具,鍛煉了學(xué)生的實(shí)際編程能力。筆者指導(dǎo)的學(xué)生參加2106年和2017年全國(guó)信息安全競(jìng)賽(作品賽),共獲得了3個(gè)三等獎(jiǎng)。對(duì)其他高校物聯(lián)網(wǎng)安全課程中的密碼學(xué)算法教學(xué)改革具有一定借鑒意義。
參考文獻(xiàn)
[1]胡小明,楊寅春,吳秀梅,等. 信息安全專業(yè)密碼學(xué)課程教學(xué)改革[J]. 計(jì)算機(jī)教育,2014(1):49-52.
[2]李曦. 密碼學(xué)課程實(shí)踐教學(xué)存在的問題及改進(jìn)措施[J]. 高等教育研究:成都,2011(2):23-24.
[3]王少輝,王志偉. 密碼學(xué)課程設(shè)計(jì)探索與實(shí)踐[J]. 課程教育研究,2013(1):15-16.
[4]嵩天,黃天羽,禮欣. Python語(yǔ)言:程序設(shè)計(jì)課程教學(xué)改革的理想選擇[J]. 中國(guó)大學(xué)教學(xué),2016(2).
[5]葉磊,文濤,劉立亮,等. 基于Python的網(wǎng)絡(luò)及信息系統(tǒng)安全過程管理工具[J]. 數(shù)字技術(shù)與應(yīng)用,2011(9):293.
[6]徐鵬,薜偉.抗差分功耗攻擊的DES算法研究[J]. 計(jì)算機(jī)仿真,2018(1)282-286.
[7]付春燕,宋英雄,郭鵬程,等. 基于AES數(shù)據(jù)加密的網(wǎng)關(guān)通信設(shè)計(jì)[J]. 電子測(cè)量技術(shù),2018(2):55-60.
[8]石井,吳哲,譚璐,等. RSA數(shù)據(jù)加密算法的分析與改進(jìn)[J]. 濟(jì)南大學(xué)學(xué)報(bào)(自然科學(xué)版),2013(3):66-69.