2009-08-25 11 views
1

Existe-t-il un moyen de crypter/décrypter le texte (forme de chaîne) dans VB.net en utilisant une autre chaîne comme une clé? C'est-à-dire, si un utilisateur crypte en utilisant cette clé, l'autre utilisateur doit décrypter en utilisant la même clé? Je ne veux pas dire chiffrement à clé publique et privée ou quoi que ce soit de ce genre. Est-ce que quelqu'un peut m'aider à construire deux sous-marins pour ceux-ci? Si ce n'est pas le cas, quelle est la deuxième meilleure façon de crypter/décrypter des données sans clé publique/privée? Je veux faire un moyen simple d'envoyer des messages en toute sécurité.Sécuriser (ish) les algorithmes de cryptage/décryptage dans vb.net en utilisant une chaîne comme une clé

Merci pour l'aide!

Répondre

4

Comme décrit dans la réponse précédente, un algorithme symétrique (dans lequel une seule clé secrète est utilisée pour crypter et décrypter) pourrait fonctionner. Il se trouve que j'ai une utilisation de l'algorithme DES. Cette routine de cryptage retourne la sortie du processus de cryptage (et le décryptage a comme entrée) une chaîne encodée en base64 plutôt qu'un tableau d'octets (qui est la sortie 'naturelle' des classes de cryptage de la structure).

Private key() As Byte = {} 
Private IV() As Byte = {&H12, &H34, &H56, &H78, &H90, &HAB, &HCD, &HEF} 
Private Const EncryptionKey As String = "abcdefgh" 
Public Function Decrypt(ByVal stringToDecrypt As String) As String 
    Try 
     Dim inputByteArray(stringToDecrypt.Length) As Byte 
     key = System.Text.Encoding.UTF8.GetBytes(Left(EncryptionKey, 8)) 
     Dim des As New DESCryptoServiceProvider 
     inputByteArray = Convert.FromBase64String(stringToDecrypt) 
     Dim ms As New MemoryStream 
     Dim cs As New CryptoStream(ms, des.CreateDecryptor(key, IV), CryptoStreamMode.Write) 
     cs.Write(inputByteArray, 0, inputByteArray.Length) 
     cs.FlushFinalBlock() 
     Dim encoding As System.Text.Encoding = System.Text.Encoding.UTF8 
     Return encoding.GetString(ms.ToArray()) 
    Catch ex As Exception 
     'oops - add your exception logic 
    End Try 
End Function 

Public Function Encrypt(ByVal stringToEncrypt As String) As String 
    Try 
     key = System.Text.Encoding.UTF8.GetBytes(Left(EncryptionKey, 8)) 
     Dim des As New DESCryptoServiceProvider 
     Dim inputByteArray() As Byte = Encoding.UTF8.GetBytes(stringToEncrypt) 
     Dim ms As New MemoryStream 
     Dim cs As New CryptoStream(ms, des.CreateEncryptor(key, IV), CryptoStreamMode.Write) 
     cs.Write(inputByteArray, 0, inputByteArray.Length) 
     cs.FlushFinalBlock() 
     Return Convert.ToBase64String(ms.ToArray()) 
    Catch ex As Exception 
     'oops - add your exception logic 
    End Try 
End Function 

Modifié ajouter:
Voici les importations que j'ai dans ce module:

Imports System 
Imports System.IO 
Imports System.Xml 
Imports System.Text 
Imports System.Security.Cryptography 

Une clé DES est une longueur de 56 bits (un peu moins de 8 octets ou caractères) . Dans une «grande image», ce n'est pas considéré comme très sûr ces jours-ci (voir this Wikipedia article on key sizes), mais comme vous l'avez décrit «secure-ish», c'est peut-être OK. Si vous avez besoin d'un cryptage plus sécurisé, vous devez rechercher l'un des algorithmes les plus sécurisés.

La clé de chiffrement dans les routines ci-dessus se trouve dans la constante privée EncryptionKey. Changez cette valeur à la clé désirée. Ou vous pouvez implémenter votre propre gestion des clés (entrée à partir du fichier, demander à l'utilisateur, etc.).

Vous ne savez pas pourquoi Gauche et Convertir seraient cassés. Left est membre de Microsoft.VisualBasic.Strings et Convert est un membre de System.

Je vous recommande fortement de lire les articles liés à par Remus Rusanu, ainsi que les autres articles liés à ceux-ci. Ils vous fourniront beaucoup d'informations sur le chiffrement dans les classes de structure.

+0

Bon, alors comment utiliser ces fonctions? Je suis encore un peu confus. Il suffit de chiffrer ("Somestringhere") et décrypter ("somestringhere")? Puis-je changer cette clé? Merci, on dirait qu'il pourrait le faire! – Cyclone

+0

Combien de temps la clé peut-elle être? – Cyclone

+0

Err, j'ai besoin d'importer un espace de noms ici clairement. Qu'est-ce que j'importe? – Cyclone

1

MSDN dispose de plusieurs exemples sur la façon de crypter et décrypter des données avec une clé symétrique (ce que vous voulez). Le plus simple à utiliser est un CryptoStream, vous pouvez créer le flux crypto au-dessus d'un flux de mémoire ordinaire ou d'un flux de fichier, écrire dans le flux crypto et les données cryptées sont écrites dans le flux de mémoire/fichier, et pour déchiffrer la crypte diffuser vers la chaîne cryptée (flux de mémoire) ou le flux de fichier et lire les données décryptées à partir du flux crypto: Encrypting Data et Decrypting Data.

Un autre exemple est celui sur l'exemple SymmetricAlgorithm qui montre l'utilisation de base d'une clé symétrique, sans l'aide d'un assistant de flux.

+0

Err, je n'ai aucune idée de ce que vous venez de dire. Que voulez-vous dire par une clé symétrique? Est-ce simplement une chaîne? Est-ce que ça doit être symétrique? – Cyclone

0

Les coupures de code ci-dessous chiffrent/déchiffrent une chaîne de données avec un mot de passe à l'aide d'une instruction mathématique xor simple (exclusive ou).

'datain = data to be encrypted 
'password is string to encrypt datain 
' 
'passwprd pointer to start 
kep= 0 
'len of data to be encrypted 
d = Len(datain$) 
'ddataout$ is encrypted string 
dataout$="" 
For n = 1 To d 
    kep=kep+1     : 'point to password location 
    i$ = Mid(password$, kep, 1) : 'get character from password 
    p = Asc(i$)     : 'convert character to integer 
    x$= Mid(datain$,n,1)  : 'get character from datain 
    h = Asc(x$)     : 'convert character to integer 
    f = h Xor p     : 'xor the two values and put result in integer 
    o$ = Chr(f)     : 'convert integer back to character 
    dataout$ = dataout$ + o$ 
    If kep = Len(password$) Then 
     kep = 0     : 'reset password pointer to first character 
    End If 
Next n 
' output string dataout$ contains encrypted data 

'dataout = data to be dencrypted 
'password is string to dencrypt datain 
' 
'passwprd pointer set to start 
kep= 0 
'len of data to be encrypted 
d = Len(dataout$) 
'ddataout$ is encrypted string 
datain$="" 
For n = 1 To d 
    kep=kep+1     : ' point to password location 
    i$ = Mid(password$, kep, 1) : 'get character from password 
    p = Asc(i$)     : ' convert character to integer 
    x$= Mid(dataout$,n,1)  : ' get character from dataout 
    h = Asc(x$)     : 'convert character to integer 
    f = h Xor p     :' xor the two values and put result in integer 
    o$ = Chr(f)     :' convert integer back to character 
    datain$ = datain$ + o$  : ' built datain string 
    If kep = Len(password$) Then 
     kep = 0     : 'reset password pointer to first character 
    End If 
Next n 
'output string datain$ contains decrypted data 
Questions connexes