Шифрование и дешифрование строк в Excel

Мне интересно, можно ли выполнить строковое шифрование/дешифрование с помощью Excel Visual Basic и некоторого поставщика криптографических услуг.

Я нашел прохождение Шифрование и дешифрование строк в Visual Basic, но, похоже, он действителен только для автономного Visual Basic.

Итак, вы бы предложили мне другой метод шифрования или показать, как пошаговое руководство может быть принято для Excel Visual Basic?

Ответ 1

В представленной вами ссылке показано, как выполнять строковое шифрование и дешифрование с помощью VB.NET и, следовательно, использовать .NET Framework.

В настоящее время продукты Microsoft Office еще не могут использовать компонент компонент Visual Studio Tools для приложений, который позволит продуктам Office получать доступ к платформе BCL.NET. библиотеки базового класса), которые, в свою очередь, получают доступ к базовому Windows CSP (поставщику криптографического сервера) и обеспечивают хорошую оболочку вокруг этих функций шифрования/дешифрования.

В настоящее время продукты Office застряли со старым VBA (Visual Basic для приложений), который основан на старом VB6 (и ранее) версии Visual Basic, основанные на COM, а не на .NET Framework.

Из-за всего этого вам придется либо обратиться к API Win32 для доступа к функциям CSP, либо вам придется использовать метод "roll-your-own" в чистом коде VB6/VBA, хотя это вероятно, будет менее безопасным. Все зависит от того, насколько безопасным будет ваше шифрование.

Если вы хотите использовать "рулонную собственную" процедуру шифрования/дешифрования базовой строки, взгляните на эту ссылку, чтобы начать:

Шифровать строку легко
Лучшее шифрование XOR с читаемой строкой
vb6 - функция шифрования
Функция Visual Basic 6/VBA для шифрования/дешифрования строк

Если вы хотите получить доступ к API Win32 и использовать базовый Windows CSP (гораздо более безопасный вариант), см. эти ссылки для получения подробной информации о том, как этого добиться:

Как зашифровать строку в Visual Basic 6.0
Доступ к функциям CryptEncrypt (CryptoAPI/WinAPI) в VBA

Эта последняя ссылка, скорее всего, та, которую вы хотите, и включает в себя полный модуль VBA Class для "обертывания" функций Windows CSP.

Ответ 2

Создайте модуль класса, называемый clsCifrado:


Option Explicit
Option Compare Binary

Private clsClave As String

Property Get Clave() As String
    Clave = clsClave
End Property

Property Let Clave(value As String)
    clsClave = value
End Property


Function Cifrar(Frase As String) As String

    Dim Cachos() As Byte
    Dim LaClave() As Byte
    Dim i As Integer
    Dim Largo As Integer

    If Frase <> "" Then
        Cachos() = StrConv(Frase, vbFromUnicode)
        LaClave() = StrConv(clsClave, vbFromUnicode)
        Largo = Len(clsClave)

        For i = LBound(Cachos) To UBound(Cachos)
            Cachos(i) = (Cachos(i) Xor LaClave(i Mod Largo)) + 34
        Next i

        Cifrar = StrConv(Cachos(), vbUnicode)
    Else
        Cifrar = ""
    End If

End Function

Function Descifrar(Frase As String) As String

    Dim Cachos() As Byte
    Dim LaClave() As Byte
    Dim i As Integer
    Dim Largo As Integer

    If Frase <> "" Then
        Cachos() = StrConv(Frase, vbFromUnicode)
        LaClave() = StrConv(clsClave, vbFromUnicode)
        Largo = Len(clsClave)

        For i = LBound(Cachos) To UBound(Cachos)
            Cachos(i) = Cachos(i) - 34
            Cachos(i) = (Cachos(i) Xor LaClave(i Mod Largo))
        Next i

        Descifrar = StrConv(Cachos(), vbUnicode)
    Else
        Descifrar = ""
    End If

End Function

Теперь вы можете использовать его в своем коде:

для шифрования


Private Sub btnCifrar_Click()

    Dim Texto As String
    Dim cCifrado As clsCifrado

    Set cCifrado = New clsCifrado

    '---poner la contraseña
    If tbxClave.Text = "" Then
        MsgBox "The Password is missing"
        End Sub
    Else
        cCifrado.Clave = tbxClave.Text
    End If

    '---Sacar los datos
    Texto = tbxFrase.Text

    '---cifrar el texto
    Texto = cCifrado.Cifrar(Texto)

    tbxFrase.Text = Texto

 End Sub

Чтобы описать


Private Sub btnDescifrar_Click()

    Dim Texto As String
    Dim cCifrado As clsCifrado

    Set cCifrado = New clsCifrado

    '---poner la contraseña
    If tbxClave.Text = "" Then
        MsgBox "The Password is missing"
        End Sub
    Else
        cCifrado.Clave = tbxClave.Text
    End If

    '---Sacar los datos
    Texto = tbxFrase.Text

    '---cifrar el texto
    Texto = cCifrado.Descifrar(Texto)

    tbxFrase.Text = Texto
End Sub

Ответ 3

Вот базовый пример симметричного шифрования/дешифрования:

Sub testit()
    Dim inputStr As String
    inputStr = "Hello world!"

    Dim encrypted As String, decrypted As String
    encrypted = scramble(inputStr)
    decrypted = scramble(encrypted)
    Debug.Print encrypted
    Debug.Print decrypted
End Sub


Function stringToByteArray(str As String) As Variant
    Dim bytes() As Byte
    bytes = str
    stringToByteArray = bytes
End Function

Function byteArrayToString(bytes() As Byte) As String
    Dim str As String
    str = bytes
    byteArrayToString = str
End Function


Function scramble(str As String) As String
    Const SECRET_PASSWORD As String = "K*4HD%f#nwS%sdf032#gfl!HLKN*pq7"

    Dim stringBytes() As Byte, passwordBytes() As Byte
    stringBytes = stringToByteArray(str)
    passwordBytes = stringToByteArray(SECRET_PASSWORD)

    Dim upperLim As Long
    upperLim = UBound(stringBytes)
    ReDim scrambledBytes(0 To upperLim) As Byte
    Dim idx As Long
    For idx = LBound(stringBytes) To upperLim
        scrambledBytes(idx) = stringBytes(idx) Xor passwordBytes(idx)
    Next idx
    scramble = byteArrayToString(scrambledBytes)
End Function

Имейте в виду, что это приведет к сбою, если заданная вами входная строка длиннее, чем SECRET_PASSWORD. Это просто пример для начала.

Ответ 4

Этот код прекрасно работает в VBA и может быть легко перемещен в VB.NET

Избегает работы с не "нормальными" персонажами. В AllowedChars вы сами решаете, какие символы разрешать.

Public Function CleanEncryptSTR(MyString As String, MyPassword As String, Encrypt As Boolean) As String
'Encrypts strings chars contained in Allowedchars
'MyString = String to decrypt
'MyPassword = Password
'Encrypt True: Encrypy   False: Decrypt
    Dim i As Integer
    Dim ASCToAdd As Integer
    Dim ThisChar As String
    Dim ThisASC As Integer
    Dim NewASC As Integer
    Dim MyStringEncrypted As String
    Dim AllowedChars As String

    AllowedChars = "&0123456789;ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"

    If Len(MyPassword) > 0 Then
        For i = 1 To Len(MyString)
'            ThisASC = Asc(Mid(MyString, i, 1))
'            ThisASC = IntFromArray(Asc(Mid(MyString, i, 1)), MyVector())

            ThisChar = Mid(MyString, i, 1)
            ThisASC = InStr(AllowedChars, ThisChar)

            If ThisASC > 0 Then
                ASCToAdd = Asc(Mid(MyPassword, i Mod Len(MyPassword) + 1, 1))
                If Encrypt Then
                    NewASC = ThisASC + ASCToAdd
                Else
                    NewASC = ThisASC - ASCToAdd
                End If
                NewASC = NewASC Mod Len(AllowedChars)
                If NewASC <= 0 Then
                    NewASC = NewASC + Len(AllowedChars)
                End If

                MyStringEncrypted = MyStringEncrypted & Mid(AllowedChars, NewASC, 1)
            Else
                MyStringEncrypted = MyStringEncrypted & ThisChar
            End If
        Next i
    Else
        MyStringEncrypted = MyString
    End If

    CleanEncryptSTR = MyStringEncrypted

End Function

Ответ 5

Вы можете вызывать данные ячейки Excel Excel через любую оболочку script. Установите GPL Bert (http://bert-toolkit.com/) Интерфейс языка R для Excel. Используйте R script ниже в Excel, чтобы передать данные ячеек в Bash/perl/gpg/openssl.

 c:\> cat c:\R322\callable_from_excel.R
    CRYPTIT <- function( PLAINTEXT, MASTER_PASS ) {
    system(
      sprintf("bash -c 'echo '%s' |
        gpg --symmetric --cipher-algo blowfish --force-mdc --passphrase '%s' -q  |
        base64 -w 0'",
        PLAINTEXT, MASTER_PASS),
      intern=TRUE)
  }

DECRYPTIT <- function( CRYPTTEXT, MASTER_PASS ) {
    system(
      sprintf("bash -c 'echo '%s'|
        base64 -d |
        gpg --passphrase '%s' -q |
        putclip | getclip' ",CRYPTTEXT,MASTER_PASS),
      intern=TRUE)  
  } 

В Excel вы можете попробовать: C1 = CRYPTIT (A1, A2) и C2 = DECRYPTIT (C1, A2) Дополнительно: putclip сохраняет дешифрованный текст в буфере обмена. Оба типа функций: String → String. Обычные оговорки об исключении одиночных кавычек в строках с одной кавычкой.

Ответ 6

Этот код хорошо работает для меня (3DES Encryption/Decryption):

Я храню INITIALIZATION_VECTOR и TRIPLE_DES_KEY как переменные среды (очевидно, разные значения, чем те, которые указаны здесь) и получают их с помощью функции VBA Environ(), поэтому все конфиденциальные данные (пароли) в коде VBA зашифровываются.

Option Explicit

Public Const INITIALIZATION_VECTOR = "zlrs$5kd"  'Always 8 characters

Public Const TRIPLE_DES_KEY = ">tlF8adk=35K{dsa" 'Always 16 characters

Sub TestEncrypt()
    MsgBox "This is an encrypted string: -> " & EncryptStringTripleDES("This is an encrypted string:")
    Debug.Print EncryptStringTripleDES("This is an encrypted string:")
End Sub

Sub TestDecrypt()
    MsgBox "u99CVItCGiMQEVYHf8+S22QbJ5CPQGDXuS5n1jvEIgU= -> " & DecryptStringTripleDES("u99CVItCGiMQEVYHf8+S22QbJ5CPQGDXuS5n1jvEIgU=")
End Sub


Function EncryptStringTripleDES(plain_string As String) As Variant

    Dim encryption_object As Object
    Dim plain_byte_data() As Byte
    Dim encrypted_byte_data() As Byte
    Dim encrypted_base64_string As String

    EncryptStringTripleDES = Null

    On Error GoTo FunctionError

    plain_byte_data = CreateObject("System.Text.UTF8Encoding").GetBytes_4(plain_string)

    Set encryption_object = CreateObject("System.Security.Cryptography.TripleDESCryptoServiceProvider")
    encryption_object.Padding = 3
    encryption_object.key = CreateObject("System.Text.UTF8Encoding").GetBytes_4(TRIPLE_DES_KEY)
    encryption_object.IV = CreateObject("System.Text.UTF8Encoding").GetBytes_4(INITIALIZATION_VECTOR)
    encrypted_byte_data = _
            encryption_object.CreateEncryptor().TransformFinalBlock(plain_byte_data, 0, UBound(plain_byte_data) + 1)

    encrypted_base64_string = BytesToBase64(encrypted_byte_data)

    EncryptStringTripleDES = encrypted_base64_string

    Exit Function

FunctionError:

    MsgBox "TripleDES encryption failed"

End Function

Function DecryptStringTripleDES(encrypted_string As String) As Variant

    Dim encryption_object As Object
    Dim encrypted_byte_data() As Byte
    Dim plain_byte_data() As Byte
    Dim plain_string As String

    DecryptStringTripleDES = Null

    On Error GoTo FunctionError

    encrypted_byte_data = Base64toBytes(encrypted_string)

    Set encryption_object = CreateObject("System.Security.Cryptography.TripleDESCryptoServiceProvider")
    encryption_object.Padding = 3
    encryption_object.key = CreateObject("System.Text.UTF8Encoding").GetBytes_4(TRIPLE_DES_KEY)
    encryption_object.IV = CreateObject("System.Text.UTF8Encoding").GetBytes_4(INITIALIZATION_VECTOR)
    plain_byte_data = encryption_object.CreateDecryptor().TransformFinalBlock(encrypted_byte_data, 0, UBound(encrypted_byte_data) + 1)

    plain_string = CreateObject("System.Text.UTF8Encoding").GetString(plain_byte_data)

    DecryptStringTripleDES = plain_string

    Exit Function

FunctionError:

    MsgBox "TripleDES decryption failed"

End Function


Function BytesToBase64(varBytes() As Byte) As String
    With CreateObject("MSXML2.DomDocument").createElement("b64")
        .DataType = "bin.base64"
        .nodeTypedValue = varBytes
        BytesToBase64 = Replace(.Text, vbLf, "")
    End With
End Function


Function Base64toBytes(varStr As String) As Byte()
    With CreateObject("MSXML2.DOMDocument").createElement("b64")
         .DataType = "bin.base64"
         .Text = varStr
         Base64toBytes = .nodeTypedValue
    End With
End Function

Исходный код, взятый здесь: https://gist.github.com/motoraku/97ad730891e59159d86c

Обратите внимание на разницу между исходным кодом и моим кодом, а это дополнительная опция encryption_object.Padding = 3, которая заставляет VBA не выполнять прописку. Если параметр padding задан равным 3, я получаю результат точно так же, как в С++-реализации алгоритма DES_ede3_cbc_encrypt и который согласуется с тем, что производится этим онлайн-инструментом ,

Ответ 7

Вы можете использовать бесплатную веб-надстройку для Excel 2016 года (и Excel онлайн) с надписью Cell Conceal.
Это в магазине приложений Microsoft.

https://appsource.microsoft.com/en-us/product/office/WA200000075?mktcmpid=discgrp

(1) Просто зайдите в магазин AppSource и найдите "Скрытие ячейки" (2) Если у вас Desktop Excel 2016 или более поздней версии, перейдите на "Вставить" → Store--> Поиск скрытия ячейки

Он прост в использовании и имеет несколько вариантов защиты конфиденциальных данных.