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); 


解决方案 »

  1.   

    '很长时间都没有用过VB了,请大侠帮忙修改一下
    '以下是我用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
      

  2.   

    计算表达式第一个参数强制转换为Long类型就不溢出了。
      

  3.   

    看不懂key = IA1 * ( key % M1 ) + IC1为什么要放到循环中,用VB实现如下:Const M1 As Long = &HFAFAFAFA
    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
      

  4.   

    key = IA1 * ( key % M1 ) + IC1
    源程序中就是那样写的大侠的程序我也测试过了,但是还是会出错,不知为什么,还是弹出实时错误'6' ,溢出
      

  5.   

    说错了,大侠改后的程序没错误,但不符合原协议加密算法,故改成如下Private Sub 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
            Key = CDbl(IA1) * (key Mod M1) + IC1
            buffer(idx) = buffer(idx) Or (SHR(dblKey, 20) And &HFF)
            idx = idx + 1
        Wend
    End Sub但还是会出错误
      

  6.   

    C源程序在变量使用上并不严谨(我并不欣赏它变量的用法),以下用VB模仿源代码,结果已测试通过:Private Sub Form_Load()
       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