下面是详细讲解“ASP实现的SHA1加密解密代码(和C#兼容)”的攻略:
概述
SHA1(Secure Hash Algorithm 1)是一种常用的哈希算法。在ASP中,可以使用VBScript或者JScript来实现SHA1加密解密操作。下面我们就来介绍如何在ASP中实现SHA1加密解密操作,并且使代码与C#兼容。
实现步骤
1. 引入JavaScript库
ASP中常用的JavaScript库有两个,一个是Micorosoft的JScript,另一个是Netscape的JavaScript。两者针对的浏览器不同,网站要兼容不同的浏览器,可以将这两个JavaScript库都引入,在使用时根据浏览器类型进行选择。引入JavaScript库的代码如下:
<!–#include virtual="/javaScript/netscape.js"–>
<!–#include virtual=”/javaScript/msie.js”–>
2. 实现SHA1加密操作
首先,需要将需要加密的字符串转化为二进制字节流。使用VBScript实现该操作的代码如下:
Function StrToHex(ByRef strData)
Dim objSHA1, objStream, arrData, intI
Set objSHA1 = Server.CreateObject("System.Security.Cryptography.SHA1CryptoServiceProvider")
Set objStream = Server.CreateObject("ADODB.Stream")
objStream.Type = 2
objStream.CharSet = "iso-8859-1"
objStream.Open
objStream.WriteText strData
objStream.Position = 0
objStream.Type = 1
arrData = objStream.Read
StrToHex = ""
For intI = 1 To Lenb(arrData)
StrToHex = StrToHex & Right("0" & Hex(Ascb(Midb(arrData, intI, 1))), 2)
Next
objStream.Close
Set objSHA1 = Nothing
Set objStream = Nothing
End Function
上述代码中,首先创建了一个系统安全哈希计算的实例对象,然后定义了一个二进制流对象,将需要加密的字符串写入该对象,并执行SHA1加密算法。最后将加密后的二进制结果转换为16进制字符串。在VBScript中,字节数组的长度不能超过32767,因此,需要对一个字符串进行分段加密,最后合并。
3. 实现SHA1解密操作
在ASP中,SHA1是不可逆的,不能实现解密操作。
4. 与C#兼容
为了与C#兼容,我们在VBScript代码中使用的是“System.Security.Cryptography.SHA1CryptoServiceProvider”这个创建SHA1实例的类,在C#中也可以使用它来实现SHA1加密。下面是在C#中实现SHA1加密的代码示例:
public static string SHA1(string strData)
{
SHA1CryptoServiceProvider objSHA1 = new SHA1CryptoServiceProvider();
byte[] arrData = Encoding.UTF8.GetBytes(strData);
byte[] arrHashData = objSHA1.ComputeHash(arrData);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < arrHashData.Length; i++)
{
sb.Append(arrHashData[i].ToString("x2"));
}
return sb.ToString();
}
上述代码中,我们使用了C#库中的“System.Security.Cryptography.SHA1CryptoServiceProvider”创建SHA1实例对象,并将加密后的二进制字节数组转换为16进制字符串,最后返回。
5. 示例说明
下面是两个示例,第一个是在ASP中使用VBScript实现SHA1加密操作,并返回16进制字符串的代码:
function SHA1_HEX(str)
dim hexcase, b, c, d, e, h, l
hexcase = 0
str = Mid(str, 1) & Chr(128)
Do While Len(str) Mod 64 <> 56
str = str & Chr(0)
Loop
For b = 0 To Len(str) - 1 Step 64
Dim W(79), a, i, tmpdata, tmplen
For i = 0 To 15
W(i) = CInt(Asc(Mid(str, b + i * 4 + 1, 1))) * &H1000000 + _
CInt(Asc(Mid(str, b + i * 4 + 2, 1))) * &H10000 + _
CInt(Asc(Mid(str, b + i * 4 + 3, 1))) * 256 + _
CInt(Asc(Mid(str, b + i * 4 + 4, 1)))
Next
For i = 16 To 79
W(i) = RL(W(i - 3) Xor W(i - 8) Xor W(i - 14) Xor W(i - 16), 1)
Next
a = &H67452301
b = &HEFCDAB89
c = &H98BADCFE
d = &H10325476
e = &HC3D2E1F0
For i = 0 To 19
tmpdata = (RL(a, 5) + f(b, c, d) + e + W(i) + K(0)) Mod &H100000000
e = d
d = c
c = RL(b, 30)
b = a
a = tmpdata
Next
For i = 20 To 39
tmpdata = (RL(a, 5) + g(b, c, d) + e + W(i) + K(1)) Mod &H100000000
e = d
d = c
c = RL(b, 30)
b = a
a = tmpdata
Next
For i = 40 To 59
tmpdata = (RL(a, 5) + h(b, c, d) + e + W(i) + K(2)) Mod &H100000000
e = d
d = c
c = RL(b, 30)
b = a
a = tmpdata
Next
For i = 60 To 79
tmpdata = (RL(a, 5) + i(b, c, d) + e + W(i) + K(3)) Mod &H100000000
e = d
d = c
c = RL(b, 30)
b = a
a = tmpdata
Next
h = (h + a) Mod &H100000000
l = (l + b) Mod &H100000000
d = (d + c) Mod &H100000000
c = (c + RL(e, 2)) Mod &H100000000
b = (b + a) Mod &H100000000
Next
Select Case hexcase
Case 0 : SHA1_HEX = Left(FormatNumber(h, 0, 0), 8) & _
FormatNumber(l, 0, 0, 0, 0), 8)
Case Else:
Dim strHex
strHex = LCase(Right("00000000" & Hex(h), 8))
strHex = strHex & LCase(Right("00000000" & Hex(l), 8))
SHA1_HEX = strHex
End Select
End Function
function RL(a, b)
RL = ((a << b) And &HFFFFFFFF) Or (a >> (32 - b))
End Function
function f(x, y, z)
f = (x And y) Or ((Not x) And z)
End Function
function g(x, y, z)
g = (x And y) Or (x And z) Or (y And z)
End Function
function h(x, y, z)
h = x Xor y Xor z
End Function
function i(x, y, z)
i = y Xor (x Or (Not z))
End Function
function K(x)
Select Case x
Case 0 : K = &H5A827999
Case 1 : K = &H6ED9EBA1
Case 2 : K = &H8F1BBCDC
Case 3 : K = &HCA62C1D6
End Select
End function
上述代码中,我们编写了一个函数“SHA1_HEX”,该函数实现了对输入字符串进行SHA1加密,并返回16进制字符串结果。下面我们通过一个例子来演示如何使用该函数:
dim str
str = "hello world"
Response.Write SHA1_HEX(str)
上述代码中,我们将字符串“hello world”进行SHA1加密,并将结果以16进制字符串的形式输出。
第二个示例是在C#中使用“System.Security.Cryptography.SHA1CryptoServiceProvider”创建对象,并对字符串进行SHA1加密操作。
using System;
using System.Security.Cryptography;
using System.Text;
public static string SHA1(string strData)
{
SHA1CryptoServiceProvider objSHA1 = new SHA1CryptoServiceProvider();
byte[] arrData = Encoding.UTF8.GetBytes(strData);
byte[] arrHashData = objSHA1.ComputeHash(arrData);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < arrHashData.Length; i++)
{
sb.Append(arrHashData[i].ToString("x2"));
}
return sb.ToString();
}
static void Main(string[] args)
{
string str = "Hello World";
string result = SHA1(str);
Console.WriteLine(result);
}
上述代码中,我们实现了一个名为“SHA1”的函数,该函数实现了对输入字符串进行SHA1加密,并返回加密结果。在Main函数中,我们使用“Hello World”字符串进行SHA1加密操作,并输出加密结果。
以上就是“ASP实现的SHA1加密解密代码(和C#兼容)”的完整攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:asp实现的sha1加密解密代码(和C#兼容) - Python技术站