Encryption 如何提高存储应用程序设置的加密效率?

Encryption 如何提高存储应用程序设置的加密效率?,encryption,application-settings,Encryption,Application Settings,我目前正在使用RC4算法来存储应用程序设置,当我观察输出时,它看起来很容易解码。以相同字母开头的字符串的输出看起来是相同的 短字符串导致短输出,长字符串产生长输出 然而,我正在寻找的东西,将产生较长的输出短字符串 有没有另一种算法,即使是短字符串,也能产生更多的“加扰”输出 我还想用一些数据作为输入的后缀或前缀,我可以很容易地识别这些数据,并在解码后去掉这些数据,从而在输出上产生更多的随机性 我已经使用下面显示的Rijndael创建了新代码,但它仍然受到输出中同样缺少变化的影响。我怀疑需要一些额

我目前正在使用RC4算法来存储应用程序设置,当我观察输出时,它看起来很容易解码。以相同字母开头的字符串的输出看起来是相同的

短字符串导致短输出,长字符串产生长输出

然而,我正在寻找的东西,将产生较长的输出短字符串

有没有另一种算法,即使是短字符串,也能产生更多的“加扰”输出

我还想用一些数据作为输入的后缀或前缀,我可以很容易地识别这些数据,并在解码后去掉这些数据,从而在输出上产生更多的随机性

我已经使用下面显示的Rijndael创建了新代码,但它仍然受到输出中同样缺少变化的影响。我怀疑需要一些额外的参数来在输出、IVs、块填充等方面创建更多的变化

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.

RC4是一种流密码。您可能想看看像AES这样的分组密码。不要忘记也使用填充,例如PKCS7


编辑:不要为了“创造更多的随机性”而添加后缀/前缀数据。加密算法将为您做到这一点(除非它是一个坏的算法,在这种情况下,请选择一个不同的算法)。充其量这是毫无意义的;在最坏的情况下,这是添加一个“crib”,这将使有人更容易攻击您的加密。

您如何生成用于加密数据的密钥?使用xor模式的流密码,您应该只使用一次密钥。它的特性与一次性焊盘非常相似。在适当的模式下使用块密码。如果您知道自己在做什么,您应该只使用流密码,因为它们比块密码更容易出错。需要的是随机IV。这对RC4也有帮助,尽管在RC4中如何使用salt/IV并不明显。使用块密码回答了“对于短字符串,将产生更长输出的东西”问题。如果使用分组密码处于CBC模式,还需要IV。流密码根本不使用IVs。我想另一种解决方案是继续使用RC4,但将每段数据填充到某个固定大小。随机前缀的作用应该非常类似于CBC模式下带有块密码的随机IV。我不认为这会削弱这项计划。我还想添加某种MAC。@CodeInChaos:关键是它不会“增加更多的随机性”到输出中——好的加密看起来无论如何都是随机的。CBC模式下的IV是为了防止相同的明文导致相同的密文,但使用流密码时,无论如何都不会有这个问题(只要每个密钥只使用一次)。最重要的是,你不应该不必要地增加复杂性。MAC是个好主意。