-2

したがって、私の現在のタスクでは、特定のテキスト文字列(例:ABC123)を取得し、LockBox3のEncryptString(source、target)関数を使用して暗号化します。文字列を正常に暗号化し、出力を取得して.txtファイルに保存できます。

このプロセスの次のステップは、LockBox3のEncryptFile(source、target)関数を使用して、すでに暗号化された文字列を含む.txtを取得し、AES-128(文字列の暗号化と同じですがdiffパスワードを使用)を使用してファイルを暗号化することです。

基本的に、文字列を正しく暗号化して.txtファイルに出力することができます。次に、ユーザーに.txtを取得して、プログラムに取り込むように要求します。次に、プログラムはそのファイルを取得してさらに暗号化しようとします。これを行うと、出力するファイルが表示されます。ただし、このファイルを復号化すると、結果の.txtに元のテキストやその他のテキストが含まれなくなります。私は基本的に、.txtファイルを暗号化する方法について混乱しています。助言がありますか?この質問/コードが十分に具体的でない場合は、お詫び申し上げます。私が苦労していることを皆さんがよりよく理解できるようにするために、状況について明確にする必要がある場合は、他に何を教えてください!ありがとう!

編集1:

皆さん、提案してくれてありがとう。明確にするために:

復号化プロセスで使用するストリームは後で使用するため、ファイルを復号化した後、ファイルから読み取り、残りの暗号化された(最初のステップからの)文字列を復号化できます。

さらに明確にするために:

文字列を暗号化するための私のコーデック(Codec1)は、CBCでAES-128を使用しており、タグは「0」、AsymetricKeySizeは1024です(これは、このタイプの暗号化には関係ありませんか?)ファイルを暗号化するための私のコーデック(上記のCodec2)の設定は同じですが、Codec1とCodec2のパスワードは異なります。基本的に、Codec1を使用して文字列を暗号化して.txtに書き込み、次にCodec2を使用して上記のファイルを暗号化します。最終的にそれを復号化し、Streamを使用して上記のファイルから読み取り、Codec1を使用してその文字列を再度復号化します。

私のファイルの暗号化/復号化コード:

文字列暗号化:

procedure TForm1.Button1Click(Sender: TObject);
begin
  codec1.Password := WORD_1;
  //Begin encryption
  sPlainText := Serial_number.Number;         //Store Serial Number of machine 
  codec1.EncryptString(sPlainText,CipherText);   //Encrypt (base64)
  listbox2.Clear;
  listbox2.AddItem(Ciphertext, AnsiCipher);
  end;

暗号化された文字列をファイルに書き込み、保存します。

saveDialog := TSaveDialog.Create(self);
  saveDialog.Title := 'Choose location to save Authentication Code';
  saveDialog.InitialDir := 'C:\';
  saveDialog.DefaultExt := '';
  saveDialog.FilterIndex := 1;
  saveDialog.Execute();
  glb_fileName1 := saveDialog.FileName;
 //open stream and write cipher to a .txt of chosen location
  try
    Stream := TFileStream.Create(saveDialog.GetNamePath + saveDialog.FileName + '.txt', fmOpenReadWrite);
  except
    Stream := TFileStream.Create(saveDialog.GetNamePath + saveDialog.FileName + '.txt', fmCreate);
  end;
    for k := 1 to (Length(CipherText)) do
        buff[k] := byte(CipherText[k]);
    ptr := @buff[1];
    Stream.WriteBuffer(ptr^, Length(CipherText));
  Stream.Free;
  saveDialog.Free;

ファイル暗号化用の.txtの場所を取得します。

procedure TForm1.Button4Click(Sender: TObject);
var
  fileName : string;
  holder_obj : TSerial_number;
begin
  holder_obj := Tserial_number.Create;
  listbox4.Clear;

if OpenTextFileDialog1.Execute() then
   fileName := OpenTextFileDialog1.FileName;     
   listbox4.AddItem(filename, holder_obj);
end;

ファイル暗号化:

  Codec2.Password := WORD_2;
  sCrypt := glb_fileName1 + '_enc.txt';
  Codec2.EncryptFile(glb_fileName1+'.txt', sCrypt);

復号化のために暗号化されたファイルを取得します。

procedure TForm1.Button3Click(Sender: TObject);
var
  holder_obj : TSerial_number;
begin
  holder_obj := Tserial_number.Create;
  listbox3.Clear;
if OpenTextFileDialog1.Execute() then
   glb_fileName2 := OpenTextFileDialog1.FileName;
   listbox3.AddItem(glb_filename2, holder_obj);
end;

ファイルの復号化(ストリームを開いて、復号化されたファイルを取得したら、そのファイルに含まれる暗号化された文字列を復号化できるようにします):

procedure TForm1.Button5Click(Sender: TObject);
var
  saveDialog : TSaveDialog;
begin
  saveDialog := TSaveDialog.Create(self);
  saveDialog.Title := 'Choose location to save Decrypted Authentication Code';
  saveDialog.InitialDir := 'C:\';
  saveDialog.DefaultExt := '';
  saveDialog.Execute();
  glb_fileName1:= saveDialog.FileName;
 //open stream and write cipher to a .txt of chosen location
  try
    Stream := TFileStream.Create(saveDialog.GetNamePath + saveDialog.FileName + '.txt', fmOpenReadWrite);
  except
    Stream := TFileStream.Create(saveDialog.GetNamePath + saveDialog.FileName + '.txt', fmCreate);
  end;
  Stream.Free;

  Codec2.Password := WORD_2;
  Codec2.DecryptFile(glb_fileName2, saveDialog.FileName + '.txt');
  saveDialog.Free;
end;
4

2 に答える 2

2

提供したコードは、何が問題になっているのかを確認するのに複雑な方法です。エンコード/デコードが機能するかどうかを確認しようとしている場合は、以下のコードのような単純なコードのみが必要です。ドライブにテストファイルを置き、名前をハードコーディングするだけです。これにより、InputFile.txtとUn-EncryptedFile.textが同じ場合にエンコード/デコードが機能することがわかります。

作業が完了したら、完全なルーチンの構築を開始できます。あなたが投稿したコードは、ボタンのクリックの間に使用され、1、2などの名前が付けられたグローバルと本当に混乱しています。何もせず、問題をさらに混乱させるだけのストリームが作成されています。物事を基本に戻し、それを最初に機能させます。

procedure TestEncodeDecode();
begin
  Codec2.Password := WORD_2;
  Codec2.EncryptFile('c:\InputFile.txt', 'c:\EncryptedFile.txt');
  Codec2.DecryptFile('c:\EncryptedFile.txt', 'c:\Un-EncryptedFile.txt');
end;
于 2013-02-05T23:48:07.977 に答える
2

私もあなたの質問が何を求めているのか混乱しています。あなたの質問を誤解する危険を冒して、私はあなたが試みていると仮定しました:

  1. 文字列を暗号化します。
  2. 暗号化された文字列をファイルに保存する
  3. ファイルを暗号化する(二重暗号化)
  4. 前の手順を逆に実行して、元の文字列を再構築します。

このselftest()方法は、これが機能することを証明します。

この解釈が正しければ、次のような解決策を検討してください。(Delphi 2010でテスト済み。XE2ではテストされていません)

unit uDoubleEncrypt;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, uTPLb_CryptographicLibrary, uTPLb_BaseNonVisualComponent,
  uTPLb_Codec;

type
  TmfmDoubleEncrypt = class(TForm)
    Codec1: TCodec;
    Codec2: TCodec;
    CryptographicLibrary1: TCryptographicLibrary;
    btnGo: TButton;
    memoLog: TMemo;
    dlgSave1: TSaveDialog;
    dlgOpen1: TOpenDialog;
    procedure btnGoClick(Sender: TObject);

  private
    FFileName_Plain, FFileName_Cipher: string;
    sSerial: string;
    function  EncryptStringWithCodec1( const sPlaintext: string): ansistring;
    function  GetFileName( dlgOpenX: TOpenDialog; var sFN: string): boolean;
    procedure SaveAnsiStringToFile( const sFN: string; const sSerialCipherText: AnsiString);
    function  ReconstructSerial: string;

  public
    procedure Put( const LineFmt: string; const Args: array of const);
    procedure Button1Click;
    procedure Button4Click;
    function  SelfTest: boolean;
  end;

var
  mfmDoubleEncrypt: TmfmDoubleEncrypt;

implementation

{$R *.dfm}

procedure TmfmDoubleEncrypt.btnGoClick( Sender: TObject);
var
  WORD_1, WORD_2: string;
begin
WORD_1 := 'red';
WORD_2 := 'blue';
sSerial := '123'; // Serial_number.Number; // Store Serial Number of machine
Codec1.Password := WORD_1;
Codec2.Password := WORD_2;

// Run the self test.
SelfTest;

// Clean up.
Codec1.Burn;
Codec2.Burn
// You may also want to delete temporary files here.
end;

function TmfmDoubleEncrypt.EncryptStringWithCodec1(
  const sPlaintext: string): ansistring;
begin
// Assume Codec1 properties already set-up:
//  1. Password
//  2. CryptoLibrary
//  3. Cipher (at design-time)
//  4. Chain-mode
Codec1.Reset; // Normally not necessary. A defence agains the codec being left in a corrupt state.
Codec1.EncryptString( sPlaintext, result)
end;


function TmfmDoubleEncrypt.GetFileName(
  dlgOpenX: TOpenDialog; var sFN: string): boolean;
begin
result := dlgOpenX.Execute;
if result then
  sFN := dlgOpenX.FileName
end;

procedure TmfmDoubleEncrypt.Put(
  const LineFmt: string; const Args: array of const);
begin
memoLog.Lines.Add( Format( LineFmt, Args))
end;

procedure TmfmDoubleEncrypt.SaveAnsiStringToFile(
  const sFN: string; const sSerialCipherText: AnsiString);
const
  Modes: array[boolean] of word = (fmCreate, fmOpenReadWrite);
var
  SaveStream: TStream;
begin
SaveStream := TFileStream.Create( sFN, Modes[ FileExists( sFN)]);
try
  SaveStream.Size := 0;
  if sSerialCipherText <> '' then
    SaveStream.WriteBuffer( sSerialCipherText[1], Length( sSerialCipherText))
finally
  SaveStream.Free
  end
end;

procedure TmfmDoubleEncrypt.Button1Click;
// This method is equivalent to gEdit101's Button1Click()
var
  sPlainText: string;
  sSerialCipherText: AnsiString;
  sFN: string;
begin
sPlainText := sSerial;
sSerialCipherText := EncryptStringWithCodec1( sPlainText);
Put( 'Encrypted serial number is %s', [sSerialCipherText]);
if GetFileName( dlgOpen1, sFN) then
  begin
  SaveAnsiStringToFile( sFN, sSerialCipherText);
  FFileName_Plain := sFN; // Store for Button4Click()
  Put('encrypted serial number save to file "%s".',[sFN])
  end;
end;

procedure TmfmDoubleEncrypt.Button4Click;
// This method is equivalent to gEdit101's Button4Click()
var
  sPlainText: string;
  sSerialCipherText: AnsiString;
  sFN: string;
begin
Codec2.Reset;
FFileName_Cipher := FFileName_Plain + '_enc.dat'; // Not a text file. + '_enc.txt' would be wrong.
Codec2.EncryptFile( FFileName_Plain, FFileName_Cipher);
Put( 'Double Encrypted serial number is now stored in file "%s"', [FFileName_Cipher]);
end;


function TmfmDoubleEncrypt.ReconstructSerial: string;
var
  CipherStream, PlainStream: TStream;
  sEncryptedSerial: AnsiString;
begin
CipherStream := TFileStream.Create( FFileName_Cipher, fmOpenRead);
PlainStream  := TMemoryStream.Create;
try
  Codec2.Reset;
  Codec2.DecryptStream( PlainStream, CipherStream);
  PlainStream.Position := 0;
  SetLength( sEncryptedSerial, PlainStream.Size);
  if Length( sEncryptedSerial) > 0 then
    PlainStream.ReadBuffer( sEncryptedSerial[1], Length( sEncryptedSerial));
  Codec1.Reset;
  Codec1.DecryptString( result, sEncryptedSerial)
finally
  CipherStream.Free;
  PlainStream.Free
  end
end;

function TmfmDoubleEncrypt.SelfTest: boolean;
var
  sRecon: string;
begin
Put('Commencing self test...',[]);
try
  Button1Click;  // 1st encryption
  Button4Click;  // 2nd encryption
  sRecon := ReconstructSerial; // Reconstruction
  result := sSerial = sRecon
finally
  Put('Finished self test. Result = %s',[BoolToStr( result, True)]);
  end;
end;

end.

このユニットのdfmは...

object mfmDoubleEncrypt: TmfmDoubleEncrypt
  Left = 0
  Top = 0
  Caption = 'Double Encrypt'
  ClientHeight = 304
  ClientWidth = 643
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  DesignSize = (
    643
    304)
  PixelsPerInch = 96
  TextHeight = 13
  object btnGo: TButton
    Left = 8
    Top = 8
    Width = 75
    Height = 25
    Caption = 'Go'
    TabOrder = 0
    OnClick = btnGoClick
  end
  object memoLog: TMemo
    Left = 8
    Top = 39
    Width = 627
    Height = 257
    Anchors = [akLeft, akTop, akRight, akBottom]
    Color = clInfoBk
    ReadOnly = True
    ScrollBars = ssVertical
    TabOrder = 1
  end
  object Codec1: TCodec
    AsymetricKeySizeInBits = 1024
    AdvancedOptions2 = []
    CryptoLibrary = CryptographicLibrary1
    Left = 440
    Top = 112
    StreamCipherId = 'native.StreamToBlock'
    BlockCipherId = 'native.AES-128'
    ChainId = 'native.CBC'
  end
  object Codec2: TCodec
    AsymetricKeySizeInBits = 1024
    AdvancedOptions2 = []
    CryptoLibrary = CryptographicLibrary1
    Left = 536
    Top = 112
    StreamCipherId = 'native.StreamToBlock'
    BlockCipherId = 'native.AES-128'
    ChainId = 'native.CBC'
  end
  object CryptographicLibrary1: TCryptographicLibrary
    Left = 480
    Top = 48
  end
  object dlgSave1: TSaveDialog
    InitialDir = 'C:\Temp'
    Title = 'Choose location to save Authentication Code'
    Left = 440
    Top = 176
  end
  object dlgOpen1: TOpenDialog
    InitialDir = 'C:\'
    Left = 536
    Top = 176
  end
end
于 2013-02-06T00:49:38.053 に答える