2009-09-24 14 views
10

में तारों को एन्क्रिप्ट करना और डिक्रिप्ट करना मुझे दिलचस्पी है यदि एक्सेल विजुअल बेसिक और कुछ क्रिप्टोग्राफिक सेवा प्रदाता का उपयोग करके स्ट्रिंग एन्क्रिप्शन/डिक्रिप्शन करना संभव है।एक्सेल

मुझे एक walkthrough Encrypting and Decrypting Strings in Visual Basic मिला है, लेकिन ऐसा लगता है कि यह केवल स्टैंडअलोन विजुअल बेसिक के लिए मान्य है।

तो क्या आप मुझे एक और एन्क्रिप्शन विधि सुझाएंगे या दिखाएंगे कि एक्सेल विजुअल बेसिक के लिए वॉथथ्रू कैसे अपनाया जा सकता है?

उत्तर

21

आपके द्वारा प्रदान किया गया लिंक दिखाता है कि VB.NET का उपयोग करके स्ट्रिंग एन्क्रिप्शन और डिक्रिप्शन कैसे करें, और इस प्रकार, .NET Framework का उपयोग करके।

वर्तमान में, माइक्रोसॉफ्ट ऑफिस उत्पाद अभी तक Visual Studio Tools for Applications घटक का उपयोग नहीं कर सकते हैं जो Office उत्पादों को .NET Framework के बीसीएल (बेस क्लास लाइब्रेरीज़) तक पहुंचने में सक्षम बनाता है, जो बदले में, अंतर्निहित विंडोज सीएसपी (क्रिप्टोग्राफिक सर्वर प्रदाता) तक पहुंचता है और एक प्रदान करता है उन एन्क्रिप्शन/डिक्रिप्शन कार्यों के आसपास अच्छा रैपर।

समय के लिए, कार्यालय उत्पादों वर्ष VBA (Visual Basic for Applications) जो पुराने VB6 (और पुराने) जो COM पर आधारित होते हैं, न कि .नेट फ्रेमवर्क से विजुअल बेसिक के संस्करण पर आधारित है के साथ फंस रहे हैं।

इस सब के कारण, आपको या तो सीएसपी कार्यों तक पहुंचने के लिए Win32 API पर कॉल करने की आवश्यकता होगी, या आपको शुद्ध VB6/VBA कोड में "रोल-अप-स्वयं" एन्क्रिप्शन विधि " कम सुरक्षित होने की संभावना है। यह सब इस बात पर निर्भर करता है कि आप "सुरक्षित" कैसे अपना एन्क्रिप्शन चाहते हैं।

आप "रोल-अपने-अपने" करने के लिए बुनियादी स्ट्रिंग एन्क्रिप्शन/डिक्रिप्शन दिनचर्या, पाने के लिए इन लिंक पर एक नज़र डालें चाहते हैं तो आप शुरू कर दिया:

Encrypt a String Easily
Better XOR Encryption with a readable string
vb6 - encryption function
Visual Basic 6/VBA String Encryption/Decryption Function

यदि आप Win32 एपीआई तक पहुंचना चाहते हैं और अंतर्निहित विंडोज सीएसपी (एक और अधिक सुरक्षित विकल्प) का उपयोग करना चाहते हैं, तो यह लिंक प्राप्त करने के तरीके के बारे में विस्तृत जानकारी के लिए इन लिंक को देखें:

How to encrypt a string in Visual Basic 6.0
Access to CryptEncrypt (CryptoAPI/WinAPI) functions in VBA

कि पिछले लिंक होने की संभावना एक तुम चाहते हो जाएगा और "रैप" करने के लिए Windows सीएसपी कार्यों एक पूरा VBA क्लास मॉड्यूल भी शामिल है।

+0

बहुत बहुत धन्यवाद! बहुत विस्तृत स्पष्टीकरण और कुछ उपयोगी लिंक। इच्छा है कि यहां सभी उत्तरों आपके जैसे थे। –

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 

descipher करने के लिए


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 
0

यहाँ एक बुनियादी symetric एन्क्रिप्शन/डिक्रिप्शन उदाहरण है:

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

    Dim enctrypted 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 से अधिक लंबी है कि इस दुर्घटना करेंगे । यह शुरू करने के लिए सिर्फ एक उदाहरण है।

1

आप किसी भी शेल स्क्रिप्ट के माध्यम से पाइप एक्सेल सेल डेटा को कॉल कर सकते हैं। एक्सेल के लिए जीपीएल बर्ट (http://bert-toolkit.com/) आर भाषा इंटरफेस स्थापित करें। बैच/perl/gpg/openssl पर पाइप सेल डेटा के लिए Excel में नीचे आर स्क्रिप्ट का उपयोग करें।

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

एक्सेल में, आप की कोशिश कर सकते हैं: सी 1 = CRYPTIT (A1, A2) और सी 2 = DECRYPTIT (सी 1, ए 2) वैकल्पिक: putclip क्लिपबोर्ड में decrypted पाठ बचाता है। दोनों कार्य प्रकार हैं: स्ट्रिंग -> स्ट्रिंग। एकल उद्धृत तारों में एकल-उद्धरण से बचने के बारे में सामान्य चेतावनी।

0

इस कोड मेरे लिए अच्छी तरह से काम करता है (3DES एन्क्रिप्शन/डिक्रिप्शन):

मैं वातावरण चर (यहां पोस्ट की तुलना में स्पष्ट रूप से अलग-अलग मान) के रूप में INITIALIZATION_VECTOR और TRIPLE_DES_KEY की दुकान और 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 बलों गद्दी प्रदर्शन नहीं है। पैडिंग विकल्प 3 पर सेट होने के साथ मुझे परिणाम मिलता है जैसे कि DES_ede3_cbc_encrypt एल्गोरिदम के C++ कार्यान्वयन में और जो online tool द्वारा उत्पादित किए गए अनुबंध के साथ है।