Const unsigned long M1 =0xFAFAFAFA;
Const unsigned long IA1 =0xF7F7F7F7;
Const unsigned long IC1 =0xF5F5F5F5;
Void encrypt(
unsigned long key,
unsigned char* buffer,
unsigned short size )
{
unsigned short idx = 0;
if( key == 0 ) key = 1;
while( idx < size )
{
key = IA1 * ( key % M1 ) + IC1; '转换成VB代码后在此处显示6 ,溢出
buffer[idx++] ^= (unsigned char)((key>>20)&0xFF);
}
}
Const unsigned long IA1 =0xF7F7F7F7;
Const unsigned long IC1 =0xF5F5F5F5;
Void encrypt(
unsigned long key,
unsigned char* buffer,
unsigned short size )
{
unsigned short idx = 0;
if( key == 0 ) key = 1;
while( idx < size )
{
key = IA1 * ( key % M1 ) + IC1; '转换成VB代码后在此处显示6 ,溢出
buffer[idx++] ^= (unsigned char)((key>>20)&0xFF);
}
}
'以下是我用VB写的
Private Function StrDecrypt(key As Long, strdata As String, size As Long) As String
Dim M1 As Long
Dim IA1 As Long
Dim IC1 As Long
Dim idx As Integer
Dim s As String
M1 = &HFAFAFAFA
IA1 = &HF7F7F7F7
IC1 = &HF5F5F5F5
If key = 0 Then
key = 1
End If
s = ""
While (idx < size)
key = IA1 * (key Mod M1) + IC1
s = s & Chr(Asc(Mid(strdata, idx, 1)) Xor ((key \ 20) And &HFF))
Wend
StrDecrypt = s
End Function
Const IA1 As Long = &HF7F7F7F7
Const IC1 As Long = &HF5F5F5F5Sub main()
Dim buffer() As Byte
buffer = StrConv("ABCD", vbFromUnicode)
Debug.Print "加密前:", StrConv(buffer, vbUnicode)
encrypt 123, buffer, UBound(buffer) + 1
Debug.Print "加密后:", StrConv(buffer, vbUnicode)
End SubSub encrypt(ByVal key As Long, ByRef buffer() As Byte, ByVal size As Integer)
Dim idx As Integer
Dim dblKey As Double
If key = 0 Then key = 1
While idx < size
dblKey = CDbl(IA1) * (key Mod M1) + IC1
buffer(idx) = buffer(idx) Or (SHR(dblKey, 20) And &HFF)
Debug.Print idx, dblKey, buffer(idx)
idx = idx + 1
Wend
End Sub'位左移
Public Function SHL(dblValue As Double, n As Byte) As Double
SHL = dblValue * 2 ^ n
End Function'位右移
Public Function SHR(dblValue As Double, n As Byte) As Double
SHR = dblValue / 2 ^ n
End Function
源程序中就是那样写的大侠的程序我也测试过了,但是还是会出错,不知为什么,还是弹出实时错误'6' ,溢出
Dim idx As Integer
'Dim dblKey As Double
If key = 0 Then key = 1
While idx < size
'dblKey = CDbl(IA1) * (key Mod M1) + IC1
Key = CDbl(IA1) * (key Mod M1) + IC1
buffer(idx) = buffer(idx) Or (SHR(dblKey, 20) And &HFF)
idx = idx + 1
Wend
End Sub但还是会出错误
Dim a As String
a = StrDecrypt(0, "ABC", 3)
Stop
End SubPrivate Function StrDecrypt(key, strdata As String, size As Long) As String
Dim M1, IA1, IC1
Dim idx As Integer
Dim s As String
M1 = CDec(HEXtoDEC("FAFAFAFA"))
IA1 = CDec(HEXtoDEC("F7F7F7F7"))
IC1 = CDec(HEXtoDEC("F5F5F5F5"))
key = CDec(key)
If key = 0 Then key = 1
While (idx < size)
key = OVadd(IA1 * Cmod(key, M1) + IC1)
s = s & Chr(Asc(Mid(strdata, idx + 1, 1)) Xor (Int(key / 2 ^ 20) And &HFF))
idx = idx + 1
Wend
StrDecrypt = s
End FunctionPrivate Function HEXtoDEC(ByVal HEXstr As String)
Dim i As Integer, j As Integer, L As Integer, Fjs
L = Len(HEXstr): If L > 24 Then HEXtoDEC = 0: Exit Function
For i = 0 To L - 1
Fjs = 1
For j = 0 To i - 1
If i > 0 Then Fjs = CDec(Fjs) * 16
Next
HEXtoDEC = CDec(HEXtoDEC) + ("&H" & Mid(HEXstr, L - i, 1)) * Fjs
Next
End FunctionPublic Function BIN_to_DEC(ByVal Bin As String) As Variant
Dim i As Integer
BIN_to_DEC = CDec(BIN_to_DEC)
For i = 1 To Len(Bin)
BIN_to_DEC = BIN_to_DEC * 2 + Mid(Bin, i, 1)
Next i
End FunctionPublic Function DEC_to_BIN(ByVal Dec) As String
Dim Bit As String, tmp As Byte
DEC_to_BIN = ""
Dec = CDec(Dec)
Do While Dec > 0
tmp = Right(Dec, 1)
If tmp Mod 2 = 0 Then Bit = 0 Else Bit = 1
DEC_to_BIN = Bit & DEC_to_BIN
Dec = Int(Dec / 2 + 0.5)
If tmp Mod 2 <> 0 Then Dec = Dec - 1
Loop
End FunctionPublic Function OVadd(ByVal Dec) As Variant
OVadd = BIN_to_DEC(Right(DEC_to_BIN(Dec), 32))
End FunctionPublic Function Cmod(ByVal Dec1, ByVal Dec2) As Variant
Cmod = Dec1 - Int(Dec1 / Dec2) * Dec2
End Function