简介
首先简单介绍一下有关加密的背景由于美国禁止几种密码算法的对外出口的加密位数(例如SSL的位加密限制)本文将介绍一种ASP可以使用的简单字符加密算法而不是那些受限制的加密算法其实这里介绍的加密算法对于一般的运用来说已经足够解密人麻烦一阵子的了它的加密基础是最简单的Vernum密码方法我将在下一篇文章中介绍这种密码
它的基本原理是需要有一个需要加密的
明文和一个随机生成的解密钥匙文件然后使用这两个文件组合起来生成密文
(明文) 组合 (密钥) = 加密后的密文
所以本文介绍的是生成密钥的代码我们假设我们生成的密钥为位长的密钥它已经足够来加密一个文本字符了代码如下
KeyGeNasp文件
<%
******************************
KeyGeNasp
******************************
Const g_KeyLocation = C:\keytxt
Const g_KeyLen =
On Error Resume Next
Call WriteKeyToFile(KeyGeN(g_KeyLen)g_KeyLocation)
if Err <> Then
ResponseWrite ERROR GENERATING KEY & <P>
ResponseWrite ErrNumber & <BR>
ResponseWrite ErrDescription & <BR>
Else
ResponseWrite KEY SUCCESSFULLY GENERATED
End If
Sub WriteKeyToFile(MyKeyStringstrFileName)
Dim keyFile fso
set fso = ServerCreateObject(scriptingFileSystemObject)
set keyFile = fsoCreateTextFile(strFileName true)
keyFileWriteLine(MyKeyString)
keyFileClose
End Sub
Function KeyGeN(iKeyLength)
Dim k iCount strMyKey
lowerbound =
upperbound =
Randomize Initialize randomnumber generator
For I = to iKeyLength
s =
k = Int(((upperbound lowerbound) + ) * Rnd + lowerbound)
strMyKey = strMyKey & Chr(k) &
next
KeyGeN = strMyKey
End Function
%>
在IIS下运行上面的KeyGeNasp页面你只需要如此做一次他将把密钥写入文件c:\keytxt中 (如果你愿意的话你也可以把这个文件放到另外一个更加安全的地方)然后你可以打开这个keytxt文件它将包含个ASCII码在到之间的字符并且由于是随机生成的所以每个人的私人密钥文件keytxt将是不一样的下面是一个例子密钥文件
IY/;$>=)?^+M#Q]VOIIQ=OFMC`:P_B;<R/U)XFHC
<SR_E$DLG=I+@%*+OP:F_=;NSY`^S`AA=BJM
WF#TLGK(=/<:+CK/^AI$;PUOME+TND?W$C(J\;
MLDF%%TF_&KAD[P#*JU%`RFCMF
(#TUFZ=>#+AW_/+]DIB;DTIATT&)O/*FM>
HXHW^Y*=+*^`^PKJ(=E/X#A:?S>R&T;+B#<:*
\@)XF`_`%QAZ?_T#$#FWWPBH^*<])A(
S@AVDC^QR^TD?(+YEX+*+U$:XO^Q]KG&N];
[LJ<OZIN?N<GTL?(MS+JMK]HC%^^+K;$WBXPA?F&^E\D$%*O/U[/?(:OVWV*Z%`:K&V?X
KURD@W^D)<OG?(VJEWLAM<$A);CQRI]*U#Q%
<Y\&SA%#<V
下面再仔细分析一下上面的程序我们发现其中的lowerbound和upperbound的数值其实就是你想使用来加密的ASCII字符范围后面一篇文章中将介绍如何使用这个密钥来加密和解密一个字符串
在第一部分讨论了如何生成密钥下面将介绍如何使用这个密钥来加密和解密一个字符串
下面的代码就是能够同时实现这个功能的函数
Cryptasp文件
<%
Dim g_Key
Const g_CryptThis = Now is the time for
all good men to come to the aid of their country
Const g_KeyLocation = c:\keytxt
g_Key = mid(ReadKeyFromFile(g_KeyLocation)Len(g_CryptThis))
ResponseWrite <p>ORIGINAL STRING: & g_CryptThis & <p>
ResponseWrite <p>KEY value: & g_Key & <p>
ResponseWrite <p>ENCRYPTED CYPHERTEXT: & EnCrypt(g_CryptThis) & <p>
ResponseWrite <p>DECRYPTED CYPHERTEXT: & DeCrypt(EnCrypt(g_CryptThis)) & <p>
Function EnCrypt(strCryptThis)
Dim strChar iKeyChar iStringChar I
for I = to Len(strCryptThis)
iKeyChar = Asc(mid(g_KeyI))
iStringChar = Asc(mid(strCryptThisI))
*** uncomment below to encrypt with addition
iCryptChar = iStringChar + iKeyChar
iCryptChar = iKeyChar Xor iStringChar
strEncrypted = strEncrypted & Chr(iCryptChar)
next
EnCrypt = strEncrypted
End Function
Function DeCrypt(strEncrypted)
Dim strChar iKeyChar iStringChar I
for I = to Len(strEncrypted)
iKeyChar = (Asc(mid(g_KeyI)))
iStringChar = Asc(mid(strEncryptedI))
*** uncomment below to decrypt with subtraction
iDeCryptChar = iStringChar iKeyChar
iDeCryptChar = iKeyChar Xor iStringChar
strDecrypted = strDecrypted & Chr(iDeCryptChar)
next
DeCrypt = strDecrypted
End Function
Function ReadKeyFromFile(strFileName)
Dim keyFile fso f
set fso = ServerCreateObject(ScriptingFileSystemObject)
set f = fsoGetFile(strFileName)
set ts = fOpenAsTextStream( )
Do While not tsAtEndOfStream
keyFile = keyFile & tsReadLine
Loop
ReadKeyFromFile = keyFile
End Function
%>
在Cryptasp中我们首先从密钥文件中得到密钥值然后从这段密钥中截取和我们需要加密的明文同样长度的密钥然后使用一个简单的异或操作将明文和密钥进行运算那么得到的结果就是加密后的密文了过程很简单的由于是使用了异或操作所以解密将非常简单只要使用同样的密钥对密文再次进行异或操作就能够解密了在上面介绍的基础上你可以少加改动就可以使用同样的方法加密一个文件唯一需要注意的是对于一个二进制文件你需要做一些完整性检查以保证转换回来的字符不要越界现在你需要做的就是把密钥保存在服务器上的一个安全的地方(不能够被外部访问)