2010-12-05 33 views
0

Je suis actuellement en train d'utiliser l'algorithme RC4 pour stocker les paramètres de l'application et quand j'observe la sortie, elle semble facilement décodable. La sortie des chaînes commençant par les mêmes lettres semble être la même.Comment puis-je augmenter l'efficacité du chiffrement pour stocker les paramètres de l'application?

Les chaînes courtes génèrent une sortie courte et les chaînes plus longues produisent une sortie plus longue.

Cependant, je cherche quelque chose qui produira une sortie plus longue pour les chaînes courtes.

Existe-t-il un autre algorithme qui créera une sortie plus «cryptée» même avec des chaînes courtes? Je veux aussi suffixer ou préfixer l'entrée avec quelques données que je peux facilement reconnaître et enlever après le décodage pour créer plus de hasard sur la sortie.

J'ai créé un nouveau code en utilisant Rijndael affiché ci-dessous, mais il souffre toujours du même manque de variation dans la sortie. Je soupçonne qu'il y a quelques paramètres supplémentaires requis pour créer plus de variation dans la sortie, IV, padding de bloc et tout cela.

unit testform; 

{$mode objfpc}{$H+} 

interface 

uses 
    Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs, 
    StdCtrls, DCPrijndael, DCPsha1; 

type 

    { TForm1 } 

    TForm1 = class(TForm) 
    edtKeyString: TEdit; 
    edtInputText: TEdit; 
    edtEncryptedText: TEdit; 
    Label1: TLabel; 
    Label2: TLabel; 
    Label3: TLabel; 
    procedure edtInputTextChange(Sender: TObject); 
    private 
    { private declarations } 
    public 
    { public declarations } 
    end; 

var 
    Form1: TForm1; 

implementation 

{ TForm1 } 

procedure TForm1.edtInputTextChange(Sender: TObject); 
var 
    Cipher: TDCP_rijndael; 
begin 
    Cipher:= TDCP_rijndael.Create(Self); 
    Cipher.InitStr(edtKeyString.Text,TDCP_sha1); 
    edtEncryptedText.Text := Cipher.EncryptString(edtInputText.Text); 
    Cipher.Burn; 
    Cipher.Free; 
end; 

initialization 
    {$I testform.lrs} 

end. 
+0

Comment générez-vous la clé que vous utilisez pour crypter les données? –

+0

Avec un chiffrement de flux en mode xor, vous ne devez utiliser qu'une clé ** une fois **. Il a des propriétés très similaires à un pad unique. Utilisez un chiffrement de bloc dans un mode approprié. Vous ne devez utiliser un chiffrement de flux que si vous savez ce que vous faites, car il est beaucoup plus facile de se tromper que de bloquer les codes. – CodesInChaos

Répondre

1

RC4 est un chiffrement de flux. Vous pourriez vouloir regarder un chiffrement de bloc comme AES. N'oubliez pas d'utiliser un rembourrage, par exemple. PKCS7.

EDIT: Ne pas ajouter des données de suffixe/préfixe afin de "créer plus aléatoire". L'algorithme de cryptage fera cela pour vous (sauf si c'est un algorithme cassé, auquel cas choisissez un algorithme différent). Au mieux, c'est inutile. Au pire, cela ajoute un «berceau» qui permettra à quelqu'un d'attaquer votre cryptage plus facilement.

+0

Ce qui est nécessaire est un IV aléatoire. Cela aurait également aidé avec RC4, bien qu'il ne soit pas évident de savoir comment utiliser un sel/IV dans RC4. –

+0

L'utilisation d'un chiffrement par bloc répond à la question "Quelque chose qui produira une sortie plus longue pour les chaînes courtes". Vous avez également besoin d'un IV si vous êtes en mode CBC avec un chiffrement par bloc. Les chiffrements de flux n'utilisent pas les IV du tout. –

+0

Je suppose qu'une autre solution consisterait à continuer à utiliser RC4 mais à conditionner chaque donnée à une taille fixe. –