zoukankan      html  css  js  c++  java
  • Base64算法与多版本加密技术

    编辑本段VB版

    注:其中DigestStrToHexStr为可在程序外部调用加密函数
    Option Explicit
    ' Base64 Encoding/Decoding Algorithm
    ' By: David Midkiff (mznull@earthlink.net)
    '
    ' This algorithms encodes and decodes data into Base64
    ' format. This format is extremely more efficient than
    ' Hexadecimal encoding.
    Private m_bytIndex(0 To 63) As Byte
    Private m_bytReverseIndex(0 To 255) As Byte
    Private Const k_bytEqualSign As Byte = 61
    Private Const k_bytMask1 As Byte = 3
    Private Const k_bytMask2 As Byte = 15
    Private Const k_bytMask3 As Byte = 63
    Private Const k_bytMask4 As Byte = 192
    Private Const k_bytMask5 As Byte = 240
    Private Const k_bytMask6 As Byte = 252
    Private Const k_bytShift2 As Byte = 4
    Private Const k_bytShift4 As Byte = 16
    Private Const k_bytShift6 As Byte = 64
    Private Const k_lMaxBytesPerLine As Long = 152
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As Long, ByVal Source As Long, ByVal Length As Long)
    Public Function Decode64(sInput As String) As String
    If sInput = "" Then Exit Function
    Decode64 = StrConv(DecodeArray64(sInput), vbUnicode)
    End Function
    Private Function DecodeArray64(sInput As String) As Byte()
    Dim bytInput() As Byte
    Dim bytWorkspace() As Byte
    Dim bytResult() As Byte
    Dim lInputCounter As Long
    Dim lWorkspaceCounter As Long
    bytInput = Replace(Replace(sInput, vbCrLf, ""), "=", "")
    ReDim bytWorkspace(LBound(bytInput) To (UBound(bytInput) * 2)) As Byte
    lWorkspaceCounter = LBound(bytWorkspace)
    For lInputCounter = LBound(bytInput) To UBound(bytInput)
    bytInput(lInputCounter) = m_bytReverseIndex(bytInput(lInputCounter))
    Next lInputCounter
    For lInputCounter = LBound(bytInput) To (UBound(bytInput) - ((UBound(bytInput) Mod 8) + 8)) Step 8
    bytWorkspace(lWorkspaceCounter) = (bytInput(lInputCounter) * k_bytShift2) + (bytInput(lInputCounter + 2) k_bytShift4)
    bytWorkspace(lWorkspaceCounter + 1) = ((bytInput(lInputCounter + 2) And k_bytMask2) * k_bytShift4) + (bytInput(lInputCounter + 4) k_bytShift2)
    bytWorkspace(lWorkspaceCounter + 2) = ((bytInput(lInputCounter + 4) And k_bytMask1) * k_bytShift6) + bytInput(lInputCounter + 6)
    lWorkspaceCounter = lWorkspaceCounter + 3
    Next lInputCounter
    Select Case (UBound(bytInput) Mod 8):
    Case 3:
    bytWorkspace(lWorkspaceCounter) = (bytInput(lInputCounter) * k_bytShift2) + (bytInput(lInputCounter + 2) k_bytShift4)
    Case 5:
    bytWorkspace(lWorkspaceCounter) = (bytInput(lInputCounter) * k_bytShift2) + (bytInput(lInputCounter + 2) k_bytShift4)
    bytWorkspace(lWorkspaceCounter + 1) = ((bytInput(lInputCounter + 2) And k_bytMask2) * k_bytShift4) + (bytInput(lInputCounter + 4) k_bytShift2)
    lWorkspaceCounter = lWorkspaceCounter + 1
    Case 7:
    bytWorkspace(lWorkspaceCounter) = (bytInput(lInputCounter) * k_bytShift2) + (bytInput(lInputCounter + 2) k_bytShift4)
    bytWorkspace(lWorkspaceCounter + 1) = ((bytInput(lInputCounter + 2) And k_bytMask2) * k_bytShift4) + (bytInput(lInputCounter + 4) k_bytShift2)
    bytWorkspace(lWorkspaceCounter + 2) = ((bytInput(lInputCounter + 4) And k_bytMask1) * k_bytShift6) + bytInput(lInputCounter + 6)
    lWorkspaceCounter = lWorkspaceCounter + 2
    End Select
    ReDim bytResult(LBound(bytWorkspace) To lWorkspaceCounter) As Byte
    If LBound(bytWorkspace) = 0 Then lWorkspaceCounter = lWorkspaceCounter + 1
    CopyMemory VarPtr(bytResult(LBound(bytResult))), VarPtr(bytWorkspace(LBound(bytWorkspace))), lWorkspaceCounter
    DecodeArray64 = bytResult
    End Function
    Public Function Encode64(ByRef sInput As String) As String
    If sInput = "" Then Exit Function
    Dim bytTemp() As Byte
    bytTemp = StrConv(sInput, vbFromUnicode)
    Encode64 = EncodeArray64(bytTemp)
    End Function
    Private Function EncodeArray64(ByRef bytInput() As Byte) As String
    On Error GoTo ErrorHandler
    Dim bytWorkspace() As Byte, bytResult() As Byte
    Dim bytCrLf(0 To 3) As Byte, lCounter As Long
    Dim lWorkspaceCounter As Long, lLineCounter As Long
    Dim lCompleteLines As Long, lBytesRemaining As Long
    Dim lpWorkSpace As Long, lpResult As Long
    Dim lpCrLf As Long
    If UBound(bytInput) < 1024 Then
    ReDim bytWorkspace(LBound(bytInput) To (LBound(bytInput) + 4096)) As Byte
    Else
    ReDim bytWorkspace(LBound(bytInput) To (UBound(bytInput) * 4)) As Byte
    End If
    lWorkspaceCounter = LBound(bytWorkspace)
    For lCounter = LBound(bytInput) To (UBound(bytInput) - ((UBound(bytInput) Mod 3) + 3)) Step 3
    bytWorkspace(lWorkspaceCounter) = m_bytIndex((bytInput(lCounter) k_bytShift2))
    bytWorkspace(lWorkspaceCounter + 2) = m_bytIndex(((bytInput(lCounter) And k_bytMask1) * k_bytShift4) + ((bytInput(lCounter + 1)) k_bytShift4))
    bytWorkspace(lWorkspaceCounter + 4) = m_bytIndex(((bytInput(lCounter + 1) And k_bytMask2) * k_bytShift2) + (bytInput(lCounter + 2) k_bytShift6))
    bytWorkspace(lWorkspaceCounter + 6) = m_bytIndex(bytInput(lCounter + 2) And k_bytMask3)
    lWorkspaceCounter = lWorkspaceCounter + 8
    Next lCounter
    Select Case (UBound(bytInput) Mod 3):
    Case 0:
    bytWorkspace(lWorkspaceCounter) = m_bytIndex((bytInput(lCounter) k_bytShift2))
    bytWorkspace(lWorkspaceCounter + 2) = m_bytIndex((bytInput(lCounter) And k_bytMask1) * k_bytShift4)
    bytWorkspace(lWorkspaceCounter + 4) = k_bytEqualSign
    bytWorkspace(lWorkspaceCounter + 6) = k_bytEqualSign
    Case 1:
    bytWorkspace(lWorkspaceCounter) = m_bytIndex((bytInput(lCounter) k_bytShift2))
    bytWorkspace(lWorkspaceCounter + 2) = m_bytIndex(((bytInput(lCounter) And k_bytMask1) * k_bytShift4) + ((bytInput(lCounter + 1)) k_bytShift4))
    bytWorkspace(lWorkspaceCounter + 4) = m_bytIndex((bytInput(lCounter + 1) And k_bytMask2) * k_bytShift2)
    bytWorkspace(lWorkspaceCounter + 6) = k_bytEqualSign
    Case 2:
    bytWorkspace(lWorkspaceCounter) = m_bytIndex((bytInput(lCounter) k_bytShift2))
    bytWorkspace(lWorkspaceCounter + 2) = m_bytIndex(((bytInput(lCounter) And k_bytMask1) * k_bytShift4) + ((bytInput(lCounter + 1)) k_bytShift4))
    bytWorkspace(lWorkspaceCounter + 4) = m_bytIndex(((bytInput(lCounter + 1) And k_bytMask2) * k_bytShift2) + ((bytInput(lCounter + 2)) k_bytShift6))
    bytWorkspace(lWorkspaceCounter + 6) = m_bytIndex(bytInput(lCounter + 2) And k_bytMask3)
    End Select
    lWorkspaceCounter = lWorkspaceCounter + 8
    If lWorkspaceCounter <= k_lMaxBytesPerLine Then
    EncodeArray64 = Left$(bytWorkspace, InStr(1, bytWorkspace, Chr$(0)) - 1)
    Else
    bytCrLf(0) = 13
    bytCrLf(1) = 0
    bytCrLf(2) = 10
    bytCrLf(3) = 0
    ReDim bytResult(LBound(bytWorkspace) To UBound(bytWorkspace))
    lpWorkSpace = VarPtr(bytWorkspace(LBound(bytWorkspace)))
    lpResult = VarPtr(bytResult(LBound(bytResult)))
    lpCrLf = VarPtr(bytCrLf(LBound(bytCrLf)))
    lCompleteLines = Fix(lWorkspaceCounter / k_lMaxBytesPerLine)
    For lLineCounter = 0 To lCompleteLines
    CopyMemory lpResult, lpWorkSpace, k_lMaxBytesPerLine
    lpWorkSpace = lpWorkSpace + k_lMaxBytesPerLine
    lpResult = lpResult + k_lMaxBytesPerLine
    CopyMemory lpResult, lpCrLf, 4&
    lpResult = lpResult + 4&
    Next lLineCounter
    lBytesRemaining = lWorkspaceCounter - (lCompleteLines * k_lMaxBytesPerLine)
    If lBytesRemaining > 0 Then CopyMemory lpResult, lpWorkSpace, lBytesRemaining
    EncodeArray64 = Left$(bytResult, InStr(1, bytResult, Chr$(0)) - 1)
    End If
    Exit Function
    ErrorHandler:
    Erase bytResult
    EncodeArray64 = bytResult
    End Function
    Private Sub Class_Initialize()
    m_bytIndex(0) = 65 'Asc("A")
    m_bytIndex(1) = 66 'Asc("B")
    m_bytIndex(2) = 67 'Asc("C")
    m_bytIndex(3) = 68 'Asc("D")
    m_bytIndex(4) = 69 'Asc("E")
    m_bytIndex(5) = 70 'Asc("F")
    m_bytIndex(6) = 71 'Asc("G")
    m_bytIndex(7) = 72 'Asc("H")
    m_bytIndex(8) = 73 'Asc("I")
    m_bytIndex(9) = 74 'Asc("J")
    m_bytIndex(10) = 75 'Asc("K")
    m_bytIndex(11) = 76 'Asc("L")
    m_bytIndex(12) = 77 'Asc("M")
    m_bytIndex(13) = 78 'Asc("N")
    m_bytIndex(14) = 79 'Asc("O")
    m_bytIndex(15) = 80 'Asc("P")
    m_bytIndex(16) = 81 'Asc("Q")
    m_bytIndex(17) = 82 'Asc("R")
    m_bytIndex(18) = 83 'Asc("S")
    m_bytIndex(19) = 84 'Asc("T")
    m_bytIndex(20) = 85 'Asc("U")
    m_bytIndex(21) = 86 'Asc("V")
    m_bytIndex(22) = 87 'Asc("W")
    m_bytIndex(23) = 88 'Asc("X")
    m_bytIndex(24) = 89 'Asc("Y")
    m_bytIndex(25) = 90 'Asc("Z")
    m_bytIndex(26) = 97 'Asc("a")
    m_bytIndex(27) = 98 'Asc("b")
    m_bytIndex(28) = 99 'Asc("c")
    m_bytIndex(29) = 100 'Asc("d")
    m_bytIndex(30) = 101 'Asc("e")
    m_bytIndex(31) = 102 'Asc("f")
    m_bytIndex(32) = 103 'Asc("g")
    m_bytIndex(33) = 104 'Asc("h")
    m_bytIndex(34) = 105 'Asc("i")
    m_bytIndex(35) = 106 'Asc("j")
    m_bytIndex(36) = 107 'Asc("k")
    m_bytIndex(37) = 108 'Asc("l")
    m_bytIndex(38) = 109 'Asc("m")
    m_bytIndex(39) = 110 'Asc("n")
    m_bytIndex(40) = 111 'Asc("o")
    m_bytIndex(41) = 112 'Asc("p")
    m_bytIndex(42) = 113 'Asc("q")
    m_bytIndex(43) = 114 'Asc("r")
    m_bytIndex(44) = 115 'Asc("s")
    m_bytIndex(45) = 116 'Asc("t")
    m_bytIndex(46) = 117 'Asc("u")
    m_bytIndex(47) = 118 'Asc("v")
    m_bytIndex(48) = 119 'Asc("w")
    m_bytIndex(49) = 120 'Asc("x")
    m_bytIndex(50) = 121 'Asc("y")
    m_bytIndex(51) = 122 'Asc("z")
    m_bytIndex(52) = 48 'Asc("0")
    m_bytIndex(53) = 49 'Asc("1")
    m_bytIndex(54) = 50 'Asc("2")
    m_bytIndex(55) = 51 'Asc("3")
    m_bytIndex(56) = 52 'Asc("4")
    m_bytIndex(57) = 53 'Asc("5")
    m_bytIndex(58) = 54 'Asc("6")
    m_bytIndex(59) = 55 'Asc("7")
    m_bytIndex(60) = 56 'Asc("8")
    m_bytIndex(61) = 57 'Asc("9")
    m_bytIndex(62) = 43 'Asc("+")
    m_bytIndex(63) = 47 'Asc("/")
    m_bytReverseIndex(65) = 0 'Asc("A")
    m_bytReverseIndex(66) = 1 'Asc("B")
    m_bytReverseIndex(67) = 2 'Asc("C")
    m_bytReverseIndex(68) = 3 'Asc("D")
    m_bytReverseIndex(69) = 4 'Asc("E")
    m_bytReverseIndex(70) = 5 'Asc("F")
    m_bytReverseIndex(71) = 6 'Asc("G")
    m_bytReverseIndex(72) = 7 'Asc("H")
    m_bytReverseIndex(73) = 8 'Asc("I")
    m_bytReverseIndex(74) = 9 'Asc("J")
    m_bytReverseIndex(75) = 10 'Asc("K")
    m_bytReverseIndex(76) = 11 'Asc("L")
    m_bytReverseIndex(77) = 12 'Asc("M")
    m_bytReverseIndex(78) = 13 'Asc("N")
    m_bytReverseIndex(79) = 14 'Asc("O")
    m_bytReverseIndex(80) = 15 'Asc("P")
    m_bytReverseIndex(81) = 16 'Asc("Q")
    m_bytReverseIndex(82) = 17 'Asc("R")
    m_bytReverseIndex(83) = 18 'Asc("S")
    m_bytReverseIndex(84) = 19 'Asc("T")
    m_bytReverseIndex(85) = 20 'Asc("U")
    m_bytReverseIndex(86) = 21 'Asc("V")
    m_bytReverseIndex(87) = 22 'Asc("W")
    m_bytReverseIndex(88) = 23 'Asc("X")
    m_bytReverseIndex(89) = 24 'Asc("Y")
    m_bytReverseIndex(90) = 25 'Asc("Z")
    m_bytReverseIndex(97) = 26 'Asc("a")
    m_bytReverseIndex(98) = 27 'Asc("b")
    m_bytReverseIndex(99) = 28 'Asc("c")
    m_bytReverseIndex(100) = 29 'Asc("d")
    m_bytReverseIndex(101) = 30 'Asc("e")
    m_bytReverseIndex(102) = 31 'Asc("f")
    m_bytReverseIndex(103) = 32 'Asc("g")
    m_bytReverseIndex(104) = 33 'Asc("h")
    m_bytReverseIndex(105) = 34 'Asc("i")
    m_bytReverseIndex(106) = 35 'Asc("j")
    m_bytReverseIndex(107) = 36 'Asc("k")
    m_bytReverseIndex(108) = 37 'Asc("l")
    m_bytReverseIndex(109) = 38 'Asc("m")
    m_bytReverseIndex(110) = 39 'Asc("n")
    m_bytReverseIndex(111) = 40 'Asc("o")
    m_bytReverseIndex(112) = 41 'Asc("p")
    m_bytReverseIndex(113) = 42 'Asc("q")
    m_bytReverseIndex(114) = 43 'Asc("r")
    m_bytReverseIndex(115) = 44 'Asc("s")
    m_bytReverseIndex(116) = 45 'Asc("t")
    m_bytReverseIndex(117) = 46 'Asc("u")
    m_bytReverseIndex(118) = 47 'Asc("v")
    m_bytReverseIndex(119) = 48 'Asc("w")
    m_bytReverseIndex(120) = 49 'Asc("x")
    m_bytReverseIndex(121) = 50 'Asc("y")
    m_bytReverseIndex(122) = 51 'Asc("z")
    m_bytReverseIndex(48) = 52 'Asc("0")
    m_bytReverseIndex(49) = 53 'Asc("1")
    m_bytReverseIndex(50) = 54 'Asc("2")
    m_bytReverseIndex(51) = 55 'Asc("3")
    m_bytReverseIndex(52) = 56 'Asc("4")
    m_bytReverseIndex(53) = 57 'Asc("5")
    m_bytReverseIndex(54) = 58 'Asc("6")
    m_bytReverseIndex(55) = 59 'Asc("7")
    m_bytReverseIndex(56) = 60 'Asc("8")
    m_bytReverseIndex(57) = 61 'Asc("9")
    m_bytReverseIndex(43) = 62 'Asc("+")
    m_bytReverseIndex(47) = 63 'Asc("/")
    End Sub

    编辑本段JS版

    var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    var base64DecodeChars = new Array(
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
    52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,
    -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
    15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
    -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
    41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1);
    function base64encode(str)
    {
    var returnVal, i, len;
    var c1, c2, c3;
    len = str.length;
    i = 0;
    returnVal = "";
    while(i < len)
    {
    c1 = str.charCodeAt(i++) & 0xff;
    if(i == len)
    {
    returnVal += base64EncodeChars.charAt(c1 >> 2);
    returnVal += base64EncodeChars.charAt((c1 & 0x3) << 4);
    returnVal += "==";
    break;
    }
    c2 = str.charCodeAt(i++);
    if(i == len)
    {
    returnVal += base64EncodeChars.charAt(c1 >> 2);
    returnVal += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4));
    returnVal += base64EncodeChars.charAt((c2 & 0xF) << 2);
    returnVal += "=";
    break;
    }
    c3 = str.charCodeAt(i++);
    returnVal += base64EncodeChars.charAt(c1 >> 2);
    returnVal += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4));
    returnVal += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6));
    returnVal += base64EncodeChars.charAt(c3 & 0x3F);
    }
    return returnVal;
    }
    function base64decode(str)
    {
    var c1, c2, c3, c4;
    var i, len, returnVal;
    len = str.length;
    i = 0;
    returnVal = "";
    while(i < len)
    {
    /* c1 */
    do
    {
    c1 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
    } while(i < len && c1 == -1);
    if(c1 == -1)
    break;
    /* c2 */
    do
    {
    c2 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
    } while(i < len && c2 == -1);
    if(c2 == -1)
    break;
    returnVal += String.fromCharCode((c1 << 2) | ((c2 & 0x30) >> 4));
    /* c3 */
    do
    {
    c3 = str.charCodeAt(i++) & 0xff;
    if(c3 == 61)
    return returnVal;
    c3 = base64DecodeChars[c3];
    } while(i < len && c3 == -1);
    if(c3 == -1)
    break;
    returnVal += String.fromCharCode(((c2 & 0XF) << 4) | ((c3 & 0x3C) >> 2));
    /* c4 */
    do
    {
    c4 = str.charCodeAt(i++) & 0xff;
    if(c4 == 61)
    return returnVal;
    c4 = base64DecodeChars[c4];
    } while(i < len && c4 == -1);
    if(c4 == -1)
    break;
    returnVal += String.fromCharCode(((c3 & 0x03) << 6) | c4);
    }
    return returnVal;
    }
    AS3版的Base64
    package crypto{
    import flash.utils.ByteArray;
    public class Base64 {
    private static const BASE64_CHARS:String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    public static function encode(data:String):String {
    // Convert string to ByteArray
    var bytes:ByteArray = new ByteArray();
    bytes.writeUTFBytes(data);
    // Return encoded ByteArray
    return encodeByteArray(bytes);
    }
    public static function encodeByteArray(data:ByteArray):String {
    // Initialise output
    var output:String = "";
    // Create data and output buffers
    var dataBuffer:Array;
    var outputBuffer:Array = new Array(4);
    // Rewind ByteArray
    data.position = 0;
    // while there are still bytes to be processed
    while (data.bytesAvailable > 0) {
    // Create new data buffer and populate next 3 bytes from data
    dataBuffer = new Array();
    for (var i:uint = 0; i < 3 && data.bytesAvailable > 0; i++) {
    dataBuffer= data.readUnsignedByte();
    }
    // Convert to data buffer Base64 character positions and
    // store in output buffer
    outputBuffer[0] = (dataBuffer[0] & 0xfc) >> 2;
    outputBuffer[1] = ((dataBuffer[0] & 0x03) << 4) | ((dataBuffer[1]) >> 4);
    outputBuffer[2] = ((dataBuffer[1] & 0x0f) << 2) | ((dataBuffer[2]) >> 6);
    outputBuffer[3] = dataBuffer[2] & 0x3f;
    // If data buffer was short (i.e not 3 characters) then set
    // end character indexes in data buffer to index of '=' symbol.
    // This is necessary because Base64 data is always a multiple of
    // 4 bytes and is basses with '=' symbols.
    for (var j:uint = dataBuffer.length; j < 3; j++) {
    outputBuffer[j + 1] = 64;
    }
    // Loop through output buffer and add Base64 characters to
    // encoded data string for each character.
    for (var k:uint = 0; k < outputBuffer.length; k++) {
    output += BASE64_CHARS.charAt(outputBuffer[k]);
    }
    }
    // Return encoded data
    return output;
    }
    public static function decode(data:String):String {
    // Decode data to ByteArray
    var bytes:ByteArray = decodeToByteArray(data);
    // Convert to string and return
    return bytes.readUTFBytes(bytes.length);
    }
    public static function decodeToByteArray(data:String):ByteArray {
    // Initialise output ByteArray for decoded data
    var output:ByteArray = new ByteArray();
    // Create data and output buffers
    var dataBuffer:Array = new Array(4);
    var outputBuffer:Array = new Array(3);
    // While there are data bytes left to be processed
    for (var i:uint = 0; i < data.length; i += 4) {
    // Populate data buffer with position of Base64 characters for
    // next 4 bytes from encoded data
    for (var j:uint = 0; j < 4 && i + j < data.length; j++) {
    dataBuffer[j] = BASE64_CHARS.indexOf(data.charAt(i + j));
    }
    // Decode data buffer back into bytes
    outputBuffer[0] = (dataBuffer[0] << 2) + ((dataBuffer[1] & 0x30) >> 4);
    outputBuffer[1] = ((dataBuffer[1] & 0x0f) << 4) + ((dataBuffer[2] & 0x3c) >> 2);
    outputBuffer[2] = ((dataBuffer[2] & 0x03) << 6) + dataBuffer[3];
    // Add all non-padded bytes in output buffer to decoded data
    for (var k:uint = 0; k < outputBuffer.length; k++) {
    if (dataBuffer[k+1] == 64) break;
    output.writeByte(outputBuffer[k]);
    }
    }
    // Rewind decoded data ByteArray
    output.position = 0;
    // Return decoded data
    return output;
    }
    public function Base64() {
    throw new Error("Base64 class is static container only");
    }
    }
    }

    编辑本段加密算法

    此算法只适用于加密ASCII映射表中的字符组成的字符串,不能处理中文字符串等:
    脚本如下:
    <script language=javascript>
    var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    var base64DecodeChars = new Array(
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
    52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,
    -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
    15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
    -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
    41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1);
    function base64encode(str) {
    var out, i, len;
    var c1, c2, c3;
    len = str.length;
    i = 0;
    out = "";
    while(i < len) {
    c1 = str.charCodeAt(i++) & 0xff;
    if(i == len)
    {
    out += base64EncodeChars.charAt(c1 >> 2);
    out += base64EncodeChars.charAt((c1 & 0x3) << 4);
    out += "==";
    break;
    }
    c2 = str.charCodeAt(i++);
    if(i == len)
    {
    out += base64EncodeChars.charAt(c1 >> 2);
    out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4));
    out += base64EncodeChars.charAt((c2 & 0xF) << 2);
    out += "=";
    break;
    }
    c3 = str.charCodeAt(i++);
    out += base64EncodeChars.charAt(c1 >> 2);
    out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4));
    out += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6));
    out += base64EncodeChars.charAt(c3 & 0x3F);
    }
    return out;
    }
    function base64decode(str) {
    var c1, c2, c3, c4;
    var i, len, out;
    len = str.length;
    i = 0;
    out = "";
    while(i < len) {
    /* c1 */
    do {
    c1 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
    } while(i < len && c1 == -1);
    if(c1 == -1)
    break;
    /* c2 */
    do {
    c2 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
    } while(i < len && c2 == -1);
    if(c2 == -1)
    break;
    out += String.fromCharCode((c1 << 2) | ((c2 & 0x30) >> 4));
    /* c3 */
    do {
    c3 = str.charCodeAt(i++) & 0xff;
    if(c3 == 61)
    return out;
    c3 = base64DecodeChars[c3];
    } while(i < len && c3 == -1);
    if(c3 == -1)
    break;
    out += String.fromCharCode(((c2 & 0XF) << 4) | ((c3 & 0x3C) >> 2));
    /* c4 */
    do {
    c4 = str.charCodeAt(i++) & 0xff;
    if(c4 == 61)
    return out;
    c4 = base64DecodeChars[c4];
    } while(i < len && c4 == -1);
    if(c4 == -1)
    break;
    out += String.fromCharCode(((c3 & 0x03) << 6) | c4);
    }
    return out;
    }
    </script>
    ================================================================================
    ================================================================================
    ================================================================================
    以下代码可以加密或处理UTF字符串:
    以及实例:
    <table width="773" border="0" align="center" cellpadding="0" cellspacing="0">
    <tr>
    <td>
    <script language=javascript>
    var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    var base64DecodeChars = new Array(
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
    52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,
    -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
    15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
    -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
    41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1);
    function base64encode(str) {
    var out, i, len;
    var c1, c2, c3;
    len = str.length;
    i = 0;
    out = "";
    while(i < len) {
    c1 = str.charCodeAt(i++) & 0xff;
    if(i == len)
    {
    out += base64EncodeChars.charAt(c1 >> 2);
    out += base64EncodeChars.charAt((c1 & 0x3) << 4);
    out += "==";
    break;
    }
    c2 = str.charCodeAt(i++);
    if(i == len)
    {
    out += base64EncodeChars.charAt(c1 >> 2);
    out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4));
    out += base64EncodeChars.charAt((c2 & 0xF) << 2);
    out += "=";
    break;
    }
    c3 = str.charCodeAt(i++);
    out += base64EncodeChars.charAt(c1 >> 2);
    out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4));
    out += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6));
    out += base64EncodeChars.charAt(c3 & 0x3F);
    }
    return out;
    }
    function base64decode(str) {
    var c1, c2, c3, c4;
    var i, len, out;
    len = str.length;
    i = 0;
    out = "";
    while(i < len) {
    /* c1 */
    do {
    c1 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
    } while(i < len && c1 == -1);
    if(c1 == -1)
    break;
    /* c2 */
    do {
    c2 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
    } while(i < len && c2 == -1);
    if(c2 == -1)
    break;
    out += String.fromCharCode((c1 << 2) | ((c2 & 0x30) >> 4));
    /* c3 */
    do {
    c3 = str.charCodeAt(i++) & 0xff;
    if(c3 == 61)
    return out;
    c3 = base64DecodeChars[c3];
    } while(i < len && c3 == -1);
    if(c3 == -1)
    break;
    out += String.fromCharCode(((c2 & 0XF) << 4) | ((c3 & 0x3C) >> 2));
    /* c4 */
    do {
    c4 = str.charCodeAt(i++) & 0xff;
    if(c4 == 61)
    return out;
    c4 = base64DecodeChars[c4];
    } while(i < len && c4 == -1);
    if(c4 == -1)
    break;
    out += String.fromCharCode(((c3 & 0x03) << 6) | c4);
    }
    return out;
    }
    function utf16to8(str) {
    var out, i, len, c;
    out = "";
    len = str.length;
    for(i = 0; i < len; i++) {
    c = str.charCodeAt(i);
    if ((c >= 0x0001) && (c <= 0x007F)) {
    out += str.charAt(i);
    } else if (c > 0x07FF) {
    out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F));
    out += String.fromCharCode(0x80 | ((c >> 6) & 0x3F));
    out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
    } else {
    out += String.fromCharCode(0xC0 | ((c >> 6) & 0x1F));
    out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
    }
    }
    return out;
    }
    function utf8to16(str) {
    var out, i, len, c;
    var char2, char3;
    out = "";
    len = str.length;
    i = 0;
    while(i < len) {
    c = str.charCodeAt(i++);
    switch(c >> 4)
    {
    case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
    // 0xxxxxxx
    out += str.charAt(i-1);
    break;
    case 12: case 13:
    // 110x xxxx 10xx xxxx
    char2 = str.charCodeAt(i++);
    out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
    break;
    case 14:
    // 1110 xxxx 10xx xxxx 10xx xxxx
    char2 = str.charCodeAt(i++);
    char3 = str.charCodeAt(i++);
    out += String.fromCharCode(((c & 0x0F) << 12) |
    ((char2 & 0x3F) << 6) |
    ((char3 & 0x3F) << 0));
    break;
    }
    }
    return out;
    }
    function doit() {
    var f = document.f
    f.output.value = base64encode(f.source.value)
    f.decode.value = base64decode(f.output.value)
    }
    </script>
    <H1 align="center">Base64编码加密
    </H1>
    <FORM NAME="f">
    原码<BR>
    <TEXTAREA NAME="source" ROWS=4 COLS=60 WRAP="soft"></TEXTAREA><BR><BR>
    Base64 encode<BR>
    <TEXTAREA NAME="output" ROWS=4 COLS=60 WRAP="soft"></TEXTAREA><BR><BR>
    Base64 decode<BR>
    <TEXTAREA NAME="decode" ROWS=4 COLS=60 WRAP="soft"></TEXTAREA><BR><BR>
    <INPUT TYPE=BUTTON VALUE="转换" ONCLICK="doit()">
    </FORM>
    </td>
    </tr>
    </table>

    编辑本段C#算法

    自己完成算法实现
    方法一: /// <summary>
    /// Base64加密
    /// </summary>
    /// <param name="Message"></param>
    /// <returns></returns>
    public string Base64Code(string Message)
    {
    char[] Base64Code = new char[]{'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','+','/','='};
    byte empty = (byte)0;
    System.Collections.ArrayList byteMessage = new System.Collections.ArrayList(System.Text.Encoding.Default.GetBytes(Message));
    System.Text.StringBuilder outmessage;
    int messageLen = byteMessage.Count;
    //将字符分成3个字节一组,如果不足,则以0补齐
    int page = messageLen / 3;
    int use = 0;
    if ((use = messageLen % 3) > 0)
    {
    for (int i = 0; i < 3 - use; i++)
    byteMessage.Add(empty);
    page++;
    }
    //将3个字节的每组字符转换成4个字节一组的。3个一组,一组一组变成4个字节一组
    //方法是:转换成ASCII码,按顺序排列24 位数据,再把这24位数据分成4组,即每组6位。再在每组的的最高位前补两个0凑足一个字节。
    outmessage = new System.Text.StringBuilder(page * 4);
    for (int i = 0; i < page; i++)
    {
    //取一组3个字节的组
    byte[] instr = new byte[3];
    instr[0] = (byte)byteMessage[i * 3];
    instr[1] = (byte)byteMessage[i * 3 + 1];
    instr[2] = (byte)byteMessage[i * 3 + 2];
    //六个位为一组,补0变成4个字节
    int[] outstr = new int[4];
    //第一个输出字节:取第一输入字节的前6位,并且在高位补0,使其变成8位(一个字节)
    outstr[0] = instr[0] >> 2;
    //第二个输出字节:取第一输入字节的后2位和第二个输入字节的前4位(共6位),并且在高位补0,使其变成8位(一个字节)
    outstr[1] = ((instr[0] & 0x03) << 4) ^ (instr[1] >> 4);
    //第三个输出字节:取第二输入字节的后4位和第三个输入字节的前2位(共6位),并且在高位补0,使其变成8位(一个字节)
    if (!instr[1].Equals(empty))
    outstr[2] = ((instr[1] & 0x0f) << 2) ^ (instr[2] >> 6);
    else
    outstr[2] = 64;
    //第四个输出字节:取第三输入字节的后6位,并且在高位补0,使其变成8位(一个字节)
    if (!instr[2].Equals(empty))
    outstr[3] = (instr[2] & 0x3f);
    else
    outstr[3] = 64;
    outmessage.Append(Base64Code[outstr[0]]);
    outmessage.Append(Base64Code[outstr[1]]);
    outmessage.Append(Base64Code[outstr[2]]);
    outmessage.Append(Base64Code[outstr[3]]);
    }
    return outmessage.ToString();
    }
    /// <summary>
    /// Base64解密
    /// </summary>
    /// <param name="Message"></param>
    /// <returns></returns>
    public string Base64Decode(string Message)
    {
    if ((Message.Length % 4) != 0)
    {
    throw new ArgumentException("不是正确的BASE64编码,请检查。", "Message");
    }
    if (!System.Text.RegularExpressions.Regex.IsMatch(Message, "^[A-Z0-9/+=]*$", System.Text.RegularExpressions.RegexOptions.IgnoreCase))
    {
    throw new ArgumentException("包含不正确的BASE64编码,请检查。", "Message");
    }
    string Base64Code = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    int page = Message.Length / 4;
    System.Collections.ArrayList outMessage = new System.Collections.ArrayList(page * 3);
    char[] message = Message.ToCharArray();
    for (int i = 0; i < page; i++)
    {
    byte[] instr = new byte[4];
    instr[0] = (byte)Base64Code.IndexOf(message[i * 4]);
    instr[1] = (byte)Base64Code.IndexOf(message[i * 4 + 1]);
    instr[2] = (byte)Base64Code.IndexOf(message[i * 4 + 2]);
    instr[3] = (byte)Base64Code.IndexOf(message[i * 4 + 3]);
    byte[] outstr = new byte[3];
    outstr[0] = (byte)((instr[0] << 2) ^ ((instr[1] & 0x30) >> 4));
    if (instr[2] != 64)
    {
    outstr[1] = (byte)((instr[1] << 4) ^ ((instr[2] & 0x3c) >> 2));
    }
    else
    {
    outstr[2] = 0;
    }
    if (instr[3] != 64)
    {
    outstr[2] = (byte)((instr[2] << 6) ^ instr[3]);
    }
    else
    {
    outstr[2] = 0;
    }
    outMessage.Add(outstr[0]);
    if (outstr[1] != 0)
    outMessage.Add(outstr[1]);
    if (outstr[2] != 0)
    outMessage.Add(outstr[2]);
    }
    byte[] outbyte = (byte[])outMessage.ToArray(Type.GetType("System.Byte"));
    return System.Text.Encoding.Default.GetString(outbyte);
    }
    直接使用.NET中的的库类函数
    方法二:
    /// <summary>
    /// Base64加密
    /// </summary>
    /// <param name="Message"></param>
    /// <returns></returns>
    public string Base64Code(string Message)
    {
    byte[] bytes = Encoding.Default.GetBytes(Message);
    return Convert.ToBase64String(bytes);
    }
    /// <summary>
    /// Base64解密
    /// </summary>
    /// <param name="Message"></param>
    /// <returns></returns>
    public string Base64Decode(string Message)
    {
    byte[] bytes = Convert.FromBase64String(Message);
    return Encoding.Default.GetString(bytes);
    }

    编辑本段MIME

    在MIME格式的电子邮件中,base64可以用来将binary的字节序列数据编码成ASCII字符序列构成的文本。使用时,在传输编码方式中指定base64。使用的字符包括大小写字母各26个,加上10个数字,和加号“+”,斜杠“/”,一共64个字符,等号“=”用来作为后缀用途。
    完整的base64定义可见 RFC1421和 RFC2045。编码后的数据比原始数据略长,为原来的4/3。在电子邮件中,根据RFC822规定,每76个字符,还需要加上一个回车换行。可以估算编码后数据长度大约为原长的135.1%。
    转换的时候,将三个byte的数据,先后放入一个24bit的缓冲区中,先来的byte占高位。数据不足3byte的话,于缓冲区中剩下的Bit用0补足。然后,每次取出6个bit,按照其值选择ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/中的字符作为编码后的输出。不断进行,直到全部输入数据转换完成。
    如果最后剩下两个输入数据,在编码结果后加1个“=”;如果最后剩下一个输入数据,编码结果后加2个“=”;如果没有剩下任何数据,就什么都不要加,这样才可以保证资料还原的正确性。
    举例来说,一段引用自Thomas Hobbes's Leviathan的文句:
    Man is distinguished, not only by his reason, but by this singular passion from other animals, which is a lust of the mind, that by a perseverance of delight in the continued and indefatigable generation of knowledge, exceeds the short vehemence of any carnal pleasure.
    经过base64编码之后变成:
    TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlz
    IHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2Yg
    dGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGlu
    dWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRo
    ZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4=
     
    ================仅供参考===========
  • 相关阅读:
    indexDB的用法
    append动态生成的元素,无法触发事件的原因及解决方案
    jquery中attr()和prop()的区别
    arguments.callee
    meter标签度量衡如何改变颜色
    Nginx入门
    linux中的权限管理
    python_面向对象
    ORM
    Flask入门
  • 原文地址:https://www.cnblogs.com/xm1-ybtk/p/5087853.html
Copyright © 2011-2022 走看看