编码和解码不是一回事...这很明显...
你看到5Lit5Zu9是1tC5+g==再编码...

解决方案 »

  1.   

    不是吧 
    5Lit5Zu9的再编码是
    NUxpdDVadTk=
      

  2.   

    这个和汉字编码有关,JS是unicode编码,汉字的编码不同,所以加密之后的结果也不同,base64加密不是很复杂,中午的时候我测试下
      

  3.   

    <HTML><HEAD><TITLE>Test Base 64</TITLE>
    <META content="MSHTML 6.00.2800.1578" name=GENERATOR></HEAD>
    <BODY><TEXTAREA id=original style="WIDTH: 100%" rows=10>博客园</TEXTAREA><BUTTON onclick=Run()>encode</BUTTON> <TEXTAREA id=encode style="WIDTH: 100%" rows=10></TEXTAREA>
    <SCRIPT language=javascript>
    function Run()
    {
        var originalString = original.value;
        encode.value = EncodeBase64(originalString);
    }
    var Base64Alphabet = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q',
        'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
        'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'];
        
    var Base64Alphabet2 = 
    {
         'A' : 0, 'B' : 1, 'C' : 2, 'D' : 3, 'E' : 4, 'F' : 5, 'G' : 6, 'H' : 7, 'I' : 8, 'J' : 9, 'K' : 10, 'L' : 11,
         'M' : 12, 'N' : 13, 'O' : 14, 'P' : 15, 'Q' : 16, 'R' : 17, 'S' : 18, 'T' : 19, 'U' : 20, 'V' : 21,
         'W' : 22, 'X' : 23, 'Y' : 24, 'Z' : 25, 'a' : 26, 'b' : 27, 'c' : 28, 'd' : 29, 'e' : 30, 'f' : 31,
         'g' : 32, 'h' : 33, 'i' : 34, 'j' : 35, 'k' : 36, 'l' : 37, 'm' : 38, 'n' : 39, 'o' : 40, 'p' : 41,
         'q' : 42, 'r' : 43, 's' : 44, 't' : 45, 'u' : 46, 'v' : 47, 'w' : 48, 'x' : 49, 'y' : 50, 'z' : 51,
         '0' : 52, '1' : 53, '2' : 54, '3' : 55, '4' : 56, '5' : 57, '6' : 58, '7' : 59, '8' : 60, '9' : 61,
         
         getCharCode : function(char)
         {
              if ( char == '+' )
              {
                   return 62;
              }
              else if ( char == '/' )
              {
                   return 63;
              }
              else if ( char == '=' )
              {
                   return 0;
              }
              else    
              {
                   return this[char];
              }           
         }
    };
    function EncodeBase64(string)
    {
        var hexString = string.getGBCode();
        window.status = hexString; 
        var base64 = '';
        var B64A = Base64Alphabet;
        var padCount = hexString.length%3;
        var count = parseInt(hexString.length/6);
        var i = 0; 
        for ( i=0 ; i < count ; ++i )
        {
             var intA = parseInt(hexString.charAt(i*6+0)+hexString.charAt(i*6+1), 16);
             var intB = parseInt(hexString.charAt(i*6+2)+hexString.charAt(i*6+3), 16);
             var intC = parseInt(hexString.charAt(i*6+4)+hexString.charAt(i*6+5), 16); 
             var part1 = intA >> 2;
             var part2 = ((intA & 0x03) << 4) | (intB >> 4);
             var part3 = ((intB & 0x0f) << 2) | (intC >> 6);
             var part4 = intC & 0x3f;
             base64 += B64A[part1] + B64A[part2] + B64A[part3] + B64A[part4]; 
        }
        if ( padCount == 1 )
        {
             var intA = parseInt(hexString.charAt(i*6+0)+hexString.charAt(i*6+1), 16);
             var intB = parseInt(hexString.charAt(i*6+2)+hexString.charAt(i*6+3), 16);
             var part1 = intA >> 2;
             var part2 = ((intA & 0x03) << 4) | (intB >> 4);
             var part3 = ((intB & 0x0f) << 2);
             base64 += B64A[part1] + B64A[part2] + B64A[part3] + '=';
        }
        if ( padCount == 2 )
        {
             var intA = parseInt(hexString.charAt(i*6+0)+hexString.charAt(i*6+1), 16);
             var part1 = intA >> 2;
             var part2 = ((intA & 0x03) << 4);
             base64 += B64A[part1] + B64A[part2] + '==';
        }        
        return base64;
    }
    </SCRIPT><SCRIPT language=vbscript>
    function vbGetGBCode(str)
        dim i, length, s
        length = len(str)
        for i=1 to length
            hexCode = hex(asc(str.charAt(i-1)))
            if (len(hexCode) mod 2) = 0 then
                s = s & hexCode
            else
                s = s & "0" & hexCode
            end if
        next
        vbGetGBCode = s
    end function
    </SCRIPT><SCRIPT language=javascript>
    String.prototype.getGBCode = function()
    {
        return vbGetGBCode(this);
    }
    </SCRIPT>
    <BUTTON onclick=Run2()>decode</BUTTON> <TEXTAREA id=decode style="WIDTH: 100%" rows=10></TEXTAREA>
    <SCRIPT language=javascript>
    function Run2()
    {
         decode.value = DecodeBase64(encode.value);
    }
    </SCRIPT><SCRIPT language=javascript>
    var Base64Alphabet2 = 
    {
         'A' : 0, 'B' : 1, 'C' : 2, 'D' : 3, 'E' : 4, 'F' : 5, 'G' : 6, 'H' : 7, 'I' : 8, 'J' : 9, 'K' : 10, 'L' : 11,
         'M' : 12, 'N' : 13, 'O' : 14, 'P' : 15, 'Q' : 16, 'R' : 17, 'S' : 18, 'T' : 19, 'U' : 20, 'V' : 21,
         'W' : 22, 'X' : 23, 'Y' : 24, 'Z' : 25, 'a' : 26, 'b' : 27, 'c' : 28, 'd' : 29, 'e' : 30, 'f' : 31,
         'g' : 32, 'h' : 33, 'i' : 34, 'j' : 35, 'k' : 36, 'l' : 37, 'm' : 38, 'n' : 39, 'o' : 40, 'p' : 41,
         'q' : 42, 'r' : 43, 's' : 44, 't' : 45, 'u' : 46, 'v' : 47, 'w' : 48, 'x' : 49, 'y' : 50, 'z' : 51,
         '0' : 52, '1' : 53, '2' : 54, '3' : 55, '4' : 56, '5' : 57, '6' : 58, '7' : 59, '8' : 60, '9' : 61,
         
         getCharCode : function(char)
         {
              if ( char == '+' )
              {
                   return 62;
              }
              else if ( char == '/' )
              {
                   return 63;
              }
              else if ( char == '=' )
              {
                   return 0;
              }
              else    
              {
                   return this[char];
              }           
         }
    };
    function DecodeBase64(strCoding)
    {
        strCoding = strCoding.replace(/\s+/g, '');
        var padCount = 0; 
        if ( strCoding.charAt(strCoding.length-2) == '=' )
        {
             padCount = 2;
        }
        else if ( strCoding.charAt(strCoding.length-1) == '=' )
        {
             padCount = 1;
        }
        var count = strCoding.length/4;
        var hexString = '';
        var B64A2 = Base64Alphabet2; 
        for ( var i=0 ; i < count ; ++i )
        {
             var part1 = B64A2.getCharCode(strCoding.charAt(i*4));
             var part2 = B64A2.getCharCode(strCoding.charAt(i*4+1));
             var part3 = B64A2.getCharCode(strCoding.charAt(i*4+2));
             var part4 = B64A2.getCharCode(strCoding.charAt(i*4+3));
             var intA = (part1 << 2) | (part2 >> 4);
             var intB = ((part2 & 0x0f ) << 4) | (part3 >> 2);
             var intC = ((part3 & 0x03 ) << 6) | part4;
             if ( intA < 0x10 )
             {
                 hexString += '0';
             }   
             hexString += intA.toString(16);
             if ( intB < 0x10 )
             {
                 hexString += '0';
             }
             hexString += intB.toString(16);
             if ( intC < 0x10 )
             {
                  hexString += '0';
             }  
             hexString += intC.toString(16); 
        }
        if ( padCount > 0 )
        {
             hexString = hexString.substr(0, hexString.length-padCount*2);
        }    
        return hexString.getString();   
    }
    function jsParseInt(numString, radix)
    {
        return parseInt(numString, radix);
    }
     
    String.prototype.getString = function()
    {
        return vbGetString(this);
    }
    </SCRIPT><SCRIPT language=vbscript>
    function vbGetString(hexString)
        dim i, length, s
        length = Len(hexString)/2
        for i=1 to length
            charCode = jsParseInt(Mid(hexString, i*2-1, 2), 16)
            if charCode < &H7F then
                s = s & Chr(charCode)
            else
                s = s & Chr(jsParseInt(Mid(hexString, i*2-1, 4), 16))
                i = i+1
            end if
        next
        vbGetString = s
    end function
    </SCRIPT>
     </BODY></HTML>
      

  4.   

    测试了下,就是我说的问题,JS的内置编码是unicode码
    举个例子,"中"这个字
    转成可变长度字节的unicode码为E4B8AD
    转成2进制为
    1110 0100 1011 1000 1010 1101
    然后经过base64加密后的编码为
    0011 1001 0000 1011 0010 0010 0010 1101
    转成索引4个字节为
    57,11,34,44
    经过索引去找base64的串的值5Lit