2016-02-07 1 views
3

J'essaie lockbox3 avec Delphi XE10. Je souhaite chiffrer la chaîne d'entrée d'un utilisateur et la comparer à une valeur à vérifier. mais chaque fois que la même chaîne d'entrée donne un résultat chiffré différent. Quelle est ma faute, s'il vous plait?Lockbox3 encryptstring: la même chaîne donne un résultat chiffré différent

ici l'exemple de code qui donne cette erreur

<UNIT CODE START> 
unit Unit21; 

interface 

uses 
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, TPLB3.Codec, TPLB3.BaseNonVisualComponent, TPLB3.CryptographicLibrary, 
    Vcl.StdCtrls; 

type 
    TForm21 = class(TForm) 
    Button1: TButton; 
    CryptographicLibrary1: TCryptographicLibrary; 
    Codec1: TCodec; 
    Label1: TLabel; 
    procedure Button1Click(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form21: TForm21; 

implementation 

{$R *.dfm} 

procedure TForm21.Button1Click(Sender: TObject); 
var s0,s1 : string; 
begin 
    codec1.Password := 'ou[asdl[kn'; 
    s0 := 'asdfghjkl'; 
    codec1.EncryptString(s0,s1); 
    label1.caption := s1; 
end; 

end. 
<UNIT CODE END> 

<FORM CODE START> 

object Form21: TForm21 
    Left = 0 
    Top = 0 
    Caption = 'Form21' 
    ClientHeight = 299 
    ClientWidth = 635 
    Color = clBtnFace 
    Font.Charset = DEFAULT_CHARSET 
    Font.Color = clWindowText 
    Font.Height = -11 
    Font.Name = 'Tahoma' 
    Font.Style = [] 
    OldCreateOrder = False 
    PixelsPerInch = 96 
    TextHeight = 13 
    object Label1: TLabel 
    Left = 168 
    Top = 72 
    Width = 31 
    Height = 13 
    Caption = 'Label1' 
    end 
    object Button1: TButton 
    Left = 32 
    Top = 72 
    Width = 75 
    Height = 25 
    Caption = 'Button1' 
    TabOrder = 0 
    OnClick = Button1Click 
    end 
    object CryptographicLibrary1: TCryptographicLibrary 
    Left = 192 
    Top = 136 
    end 
    object Codec1: TCodec 
    AsymetricKeySizeInBits = 512 
    AdvancedOptions2 = [] 
    CryptoLibrary = CryptographicLibrary1 
    Left = 200 
    Top = 192 
    StreamCipherId = 'native.StreamToBlock' 
    BlockCipherId = 'native.AES-256' 
    ChainId = 'native.CBC' 
    end 
end 
<FORM CODE END> 
+0

Crypto vous faut vraiment avoir une compréhension de base. Sans cela, vous risquez de produire du code non sécurisé. –

Répondre

6

À première vue, le problème semble que vous utilisez le mode CBC (chaining bloc Cipher) d'AES.

En réalité, ce n'est pas un problème, mais la façon dont le mode CBC a été conçu pour fonctionner.

Vérifiez cet article wikipedia pour plus de détails sur Block cipher mode of operation

En cryptographie, un mode de fonctionnement est un algorithme qui utilise un algorithme de chiffrement bloc pour fournir un service d'information telles que la confidentialité ou authenticité. Un chiffrement de bloc ne convient qu'à lui seul pour la transformation cryptographique sécurisée (cryptage ou décryptage) d'un groupe de bits de longueur fixe appelé bloc. Un mode de fonctionnement décrit comment appliquer de façon répétée l'opération de bloc unique d'un chiffrement à pour transformer en toute sécurité des quantités de données supérieures à un bloc.

...

En mode CBC, chaque bloc de texte brut est XORé avec le bloc précédent cryptogramme avant d'être crypté. De cette façon, chaque bloc chiffré dépend de tous les blocs en clair traités jusqu'à ce point. Pour rendre chaque message unique, un vecteur d'initialisation doit être utilisé dans le premier bloc .


Si vous souhaitez recevoir toujours le même texte chiffré pour un texte ordinaire, vous pouvez passer à la de base BCE (Electronic Codebook) en mode à la place (par exemple. Changer ChainId = 'native.CBC'-ChainId = 'native.ECB').

Mais cela n'est pas recommandé car cela rend votre texte chiffré vulnérable à certaines attaques. Un chiffrement symétrique ne doit pas être utilisé pour chiffrer plus d'une fois le même texte brut avec la même clé.

C'est pourquoi les modes de fonctionnement de chaînage ont été introduits. Ils sont utilisés pour "générer" une séquence de clés dérivées (basée sur la clé que vous avez fournie - qui dans votre cas est elle-même basée sur le mot de passe) qui sont utilisées à la place de la clé de base.

Assurez-vous de lire aussi cette question:


Si vous concevez un système dans le monde réel (qui sera utilisé par d'autres personnes que vous-même), et vous devez assurer la sécurité de n'importe quelle partie de celui-ci, investir un peu de temps dans l'apprentissage de la cryptographie.

Un bon départ est de suivre un cours similaire sur la cryptographie: Cryptography I (gratuit)