Publicação Ler

AspClassico - Criptografia AES CBC HMac

AspClassico - Criptografia AES CBC HMac

AES_SHA256.asp
 

<%
' AES-256-CBC with HMAC-SHA-256 in VBScript
Set utf8 = CreateObject("System.Text.UTF8Encoding")
Set b64Enc = CreateObject("System.Security.Cryptography.ToBase64Transform")
Set b64Dec = CreateObject("System.Security.Cryptography.FromBase64Transform")
Set mac = CreateObject("System.Security.Cryptography.HMACSHA256")
Set aes = CreateObject("System.Security.Cryptography.RijndaelManaged")
Set mem = CreateObject("System.IO.MemoryStream")
Function Min(a, b)
    Min = a
    If b < a Then Min = b
End Function

Function B64Encode(bytes)
    blockSize = b64Enc.InputBlockSize
    For offset = 0 To LenB(bytes) - 1 Step blockSize
        length = Min(blockSize, LenB(bytes) - offset)
        b64Block = b64Enc.TransformFinalBlock((bytes), offset, length)
        result = result & utf8.GetString((b64Block))
    Next
    B64Encode = result
End Function


Function B64Decode(b64Str)
    bytes = utf8.GetBytes_4(b64Str)
    B64Decode = b64Dec.TransformFinalBlock((bytes), 0, LenB(bytes))
End Function


Function ConcatBytes(a, b)
    mem.SetLength(0)
    mem.Write (a), 0, LenB(a)
    mem.Write (b), 0, LenB(b)
    ConcatBytes = mem.ToArray()
End Function


Function EqualBytes(a, b)
    EqualBytes = False
    If LenB(a) <> LenB(b) Then Exit Function
    diff = 0
    For i = 1 to LenB(a)
        diff = diff Or (AscB(MidB(a, i, 1)) Xor AscB(MidB(b, i, 1)))
    Next
    EqualBytes = Not diff
End Function

Function ComputeMAC(msgBytes, keyBytes)
    mac.Key = keyBytes
    ComputeMAC = mac.ComputeHash_2((msgBytes))
End Function


'Criptografe o texto simples e calcule o MAC para o resultado.
'
'O comprimento da chave de criptografia AES (aesKey) deve ser de 256 bits (32 bytes).
'Deve ser fornecido como uma string codificada em Base64. No macOS ou Linux,
'digite este comando para gerar uma chave de 256 bits codificada em Base64:
'
'head -c32 / dev / urandom | base64
'
'A chave secreta HMAC (macKey) pode ter qualquer comprimento, mas um mínimo de
'256 bits (32 bytes) é recomendado como o comprimento desta chave. Isso deve
'ser fornecido como uma string codificada em Base64.
'
'O valor de retorno desta função é composto pelos três seguintes
'Strings codificados em Base64 unidos por dois pontos:
'
'- Código de autenticação da mensagem.
'- Vetor de inicialização de 128 bits gerado aleatoriamente (IV).
'- Texto cifrado.
'
' Nota:
'
'- Uma chave de 256 bits após a codificação Base64 contém 44 caracteres
'incluindo um' = 'caractere como preenchimento no final.
'- Um IV de 128 bits após a codificação Base64 contém 24 caracteres
'incluindo dois' = 'caracteres como preenchimento no final.
'
'Argumentos:
'plaintext (String): Texto a ser criptografado.
'aesKey (String): chave de criptografia AES codificada como uma string Base64.
'macKey (String): chave secreta HMAC codificada como uma string Base64.
'
'Retorna:
'String: MAC, IV e texto cifrado unidos por dois pontos.

Function Encrypt(plaintext, aesKey, macKey)
    aes.GenerateIV()
    aesKeyBytes = B64Decode(aesKey)
    macKeyBytes = B64Decode(macKey)
    Set aesEnc = aes.CreateEncryptor_2((aesKeyBytes), aes.IV)
    plainBytes = utf8.GetBytes_4(plaintext)
    cipherBytes = aesEnc.TransformFinalBlock((plainBytes), 0, LenB(plainBytes))
    macBytes = ComputeMAC(ConcatBytes(aes.IV, cipherBytes), macKeyBytes)
    Encrypt = B64Encode(macBytes) & ":" & B64Encode(aes.IV) & ":" & _
              B64Encode(cipherBytes)
End Function

'Descriptografe o texto cifrado depois de autenticar o IV e o texto cifrado usando MAC.
'
'MAC, IV e o texto cifrado devem ser codificados em Base64. Eles são fornecidos
'juntos como uma única string com os valores codificados em Base64 separados
'por dois pontos. Veja o comentário da função Encrypt () para ler mais sobre
' O formato.
'
'Argumentos:
'macIVCipherText (String): MAC, IV e texto cifrado separados por dois pontos.
'aesKey (String): chave de criptografia AES codificada como uma string Base64.
'macKey (String): chave secreta HMAC codificada como uma string Base64.
'
'Retorna:
'String: Texto simples para o qual o texto cifrado fornecido é descriptografado.
Function Decrypt(macIVCiphertext, aesKey, macKey)
    aesKeyBytes = B64Decode(aesKey)
    macKeyBytes = B64Decode(macKey)
    tokens = Split(macIVCiphertext, ":")
    macBytes = B64Decode(tokens(0))
    ivBytes = B64Decode(tokens(1))
    cipherBytes = B64Decode(tokens(2))
    macActual = ComputeMAC(ConcatBytes(ivBytes, cipherBytes), macKeyBytes)
    If Not EqualBytes(macBytes, macActual) Then
        Err.Raise vbObjectError + 1000, "Decrypt()", "Bad MAC"
    End If
    Set aesDec = aes.CreateDecryptor_2((aesKeyBytes), (ivBytes))
    plainBytes = aesDec.TransformFinalBlock((cipherBytes), 0, LenB(cipherBytes))
    Decrypt = utf8.GetString((plainBytes))
End Function


' Mostra propriedades interessantes de objetos de criptografia usados aqui.
Function CryptoInfo
    Set enc = aes.CreateEncryptor_2(aes.Key, aes.IV)
    Set dec = aes.CreateDecryptor_2(aes.Key, aes.IV)

    CryptoInfo = "aes.BlockSize: " & aes.BlockSize & vbCrLf & _
                 "aes.FeedbackSize: " & aes.FeedbackSize & vbCrLf & _
                 "aes.KeySize: " & aes.KeySize & vbCrLf & _
                 "aes.Mode: " & aes.Mode & vbCrLf & _
                 "aes.Padding: " & aes.Padding & vbCrLf & _
                 "mac.HashName: " & mac.HashName & vbCrLf & _
                 "mac.HashSize: " & mac.HashSize & vbCrLf & _
                 "aesEnc.InputBlockSize: " & enc.InputBlockSize & vbCrLf & _
                 "aesEnc.OutputBlockSize: " & enc.OutputBlockSize & vbCrLf & _
                 "aesDec.InputBlockSize: " & enc.InputBlockSize & vbCrLf & _
                 "aesDec.OutputBlockSize: " & enc.OutputBlockSize & vbCrLf & _
                 "b64Enc.InputBlockSize: " & b64Enc.InputBlockSize & vbCrLf & _
                 "b64Enc.OutputBlockSize: " & b64Enc.OutputBlockSize & vbCrLf & _
                 "b64Dec.InputBlockSize: " & b64Dec.InputBlockSize & vbCrLf & _
                 "b64Dec.OutputBlockSize: " & b64Dec.OutputBlockSize & vbCrLf
End Function
%>

-------------------------------------------------------------------------------------------------------

exemplo.asp

<%
Plaintext = "AspClassico"
AESKey = "QGFzcF9jbGFzc2ljb0A="                          ' Palavra @asp_classico@ convertido para Base64 - Deve ter 14 caracteres
MACKey = "VTXs5H3SsmamlMowXb/I6ZdIT06qnzliI1UOK4B8uhM="  ' Hash SHA-256 gerado com   TextPlain="MinhaEmpresa", SecretKey="@MinhaEmpresa"

' Testei com os sites abaixo e produziu o mesmo resultado, posteriormente convertido para Base64
' https://codebeautify.org/hmac-generator
' https://www.devglan.com/online-tools/hmac-sha256-online

encrypted1 = Encrypt(Plaintext, AESKey, MACKey)
decrypted1 = Decrypt(encrypted1, AESKey, MACKey)


response.write "Texto origem: " & decrypted1
response.write "
Criptogrado : " & encrypted1

%>





instagram whatsapp