⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pas_demo.pas

📁 blowfish加密算法开发包
💻 PAS
字号:

{
        PAS_DEMO.PAS
        test program for compatibility & speed of BLOWFISH.TPU
        language   : Turbo/Borland Pascal
        last update: 06/06/96
        (c)1996 Markus Hahn & Cedric Reinartz
}


program PAS_DEMO;
uses Crt, Dos, Blowfish;


const
  { official test vectors from DDJ 10/95... }
  key1        : String = 'abcdefghijklmnopqrstuvwxyz';
  testdata1_p : array[1..2] of ULONG = ($424c4f57, $46495348);
  testdata1_c : array[1..2] of ULONG = ($324ed0fe, $f413a203);

  key2        : String = 'Who is John Galt?';
  testdata2_p : array[1..2] of ULONG = ($fedcba98, $76543210);
  testdata2_c : array[1..2] of ULONG = ($cc91732b, $8022f684);

  BIGBUFSIZE  = 32000;
  TESTLOOPS   = 128;    { suitable for a DX4 }
  SCRLOOPS    = 1024;



{
        ULONG2HEX - converts a ULONG into a string
        -> ULONG
        <- String
}
function ULONG2Hex(ulTheVal : ULONG) : String;
const
  HEXTAB : String[16] = '0123456789abcdef';
var
      nI : Integer;
   sTemp : String[8];
begin
  sTemp[0]:=Chr(8);
  for nI:=0 to 7 do
    sTemp[8-nI]:=HEXTAB[((ulTheVal shr (nI*4)) and $0f) + 1];
  ULONG2Hex:=sTemp;
end;


{
        RANDOM32 - creates a 32 bit random value
        <- random ULONG
}
function Random32 : ULONG;
begin
  Random32:=(ULONG(Random($ffff)) shl 16) or Random($ffff);
end;


{ big buffer for benchmark }
type
  PBigBuf = ^TBigBuf;
  TBigBuf = array[1..BIGBUFSIZE] of Byte;


{ global data... }
var
  ulCBCIVL   : ULONG;   { IV = initialisation vector }
  ulCBCIVR   : ULONG;
  ulCBCLeft  : ULONG;
  ulCBCRight : ULONG;
  ulEqual    : ULONG;
  sMyKey     : String;
  testbuf    : array[1..6] of ULONG;
  unI        : UINT;
  biggy      : PBigBuf;
  ulStart    : ULONG;
  ulTime     : ULONG;
  ulRate     : ULONG;
  h,m,s,c    : UINT;
  pBoxes     : P_ULONG_Buffer;
  BF_key     : array[1..1058] of ULONG;
  BF_keysave : array[1..1058] of ULONG;
  pScreen    : P_ULONG_Buffer;



begin
     ClrScr;
     Randomize;

     Blowfish_GetBoxes(@BF_key[1]);      { save original boxes }
     { the following compare is not necessary. Just to show the function }
     if Blowfish_SetRounds(16) <> 16 then writeln('Could not set Rounds');

     { Are we compatible? }

     { test vector #1 }
     TextColor(10); WriteLn('test data #1...'); TextColor(7);

     Blowfish_Init(@key1[1], Length(key1));
     { show the first 6 p-boxes }
     pBoxes:=Blowfish_GetBoxPointer;
     Write('pboxes : ');
     for unI:=0 to 5 do
       Write(ULONG2Hex(pBoxes^[unI]), ' ');
     WriteLn;
     { now en-/decrypt and compare with the official values }
     WriteLn('plaintext : ', ULONG2Hex(testdata1_p[1]),
             ' ',            ULONG2Hex(testdata1_p[2]));
     Blowfish_ECBEncrypt(@testdata1_p[1], 8);
     WriteLn('ciphertext: ', ULONG2Hex(testdata1_p[1]),
             ' ',            ULONG2Hex(testdata1_p[2]));
     WriteLn('DDJ 10/95 : ', ULONG2Hex(testdata1_c[1]),
             ' ',            ULONG2Hex(testdata1_c[2]));
     Blowfish_ECBDecrypt(@testdata1_p[1], 8);
     WriteLn('decrypted : ', ULONG2Hex(testdata1_p[1]),
             ' ',            ULONG2Hex(testdata1_p[2]));

     { #2 }
     TextColor(10); WriteLn('test data #2...'); TextColor(7);
     Blowfish_SetBoxes(@BF_key[1]);      { reload boxes }
     Blowfish_Init(@key2[1], Length(key2));
     pBoxes:=Blowfish_GetBoxPointer;
     Write('pboxes : ');
     for unI:=0 to 5 do
       Write(ULONG2Hex(pBoxes^[unI]), ' ');
     WriteLn;
     WriteLn('plaintext : ', ULONG2Hex(testdata2_p[1]),
             ' ',            ULONG2Hex(testdata2_p[2]));
     Blowfish_ECBEncrypt(@testdata2_p[1], 8);
     WriteLn('ciphertext: ', ULONG2Hex(testdata2_p[1]),
             ' ',            ULONG2Hex(testdata2_p[2]));
     WriteLn('DDJ 10/95 : ', ULONG2Hex(testdata2_c[1]),
             ' ',            ULONG2Hex(testdata2_c[2]));
     Blowfish_ECBDecrypt(@testdata2_p[1], 8);
     WriteLn('decrypted : ', ULONG2Hex(testdata2_p[1]),
             ' ',            ULONG2Hex(testdata2_p[2]));
     WriteLn(#13#10, 'press a key ...', #13#10);
     ReadKey;

     { test ECB routines, work with small buffer... }
     { 16 rounds }
     Blowfish_SetBoxes(@BF_key[1]);      { reload boxes }
     sMyKey:='Who wants some?';
     Blowfish_Init(@sMyKey[1], Length(sMyKey));
     TextColor(10); WriteLn('ECB test, 16 rounds...'); TextColor(7);
     WriteLn('original data:');
     { generate and show random numbers...}
     for unI:=1 to 6 do begin
       testbuf[unI]:=Random32;
       Write(ULONG2Hex(testbuf[unI]), '  ');
     end;
     WriteLn;
     WriteLn('encrypted data:');
     Blowfish_ECBEncrypt(@testbuf[1], 6*4);
     for unI:=1 to 6 do Write(ULONG2Hex(testbuf[unI]), '  ');
     WriteLn;
     WriteLn('decrypted data:');
     Blowfish_ECBDecrypt(@testbuf[1], 6*4);
     for unI:=1 to 6 do Write(ULONG2Hex(testbuf[unI]), '  ');
     WriteLn;
     { 32 rounds }
     Blowfish_SetRounds(32);      { set number of encryption rounds to 32 }
     Blowfish_SetBoxes(@BF_key[1]);      { reload boxes }
     sMyKey:='Who wants some?';
     Blowfish_Init(@sMyKey[1], Length(sMyKey));
     TextColor(10); WriteLn('ECB test, 32 rounds...'); TextColor(7);
     WriteLn('original data:');
     for unI:=1 to 6 do Write(ULONG2Hex(testbuf[unI]), '  ');
     WriteLn;
     WriteLn('encrypted data:');
     Blowfish_ECBEncrypt(@testbuf[1], 6*4);
     for unI:=1 to 6 do Write(ULONG2Hex(testbuf[unI]), '  ');
     WriteLn;
     WriteLn('decrypted data:');
     Blowfish_ECBDecrypt(@testbuf[1], 6*4);
     for unI:=1 to 6 do Write(ULONG2Hex(testbuf[unI]), '  ');
     WriteLn; WriteLn;

     WriteLn(#13#10, 'press a key...', #13#10);
     ReadKey;

     { now test the CBC routines... }
     { 16 rounds }
     Blowfish_SetRounds(16);
     sMyKey:='Damn, I''m looking good!';
     TextColor(10); WriteLn('CBC test, 16 rounds...'); TextColor(7);
     ulCBCLeft:=Random32;     { create an IV "server" }
     ulCBCRight:=Random32;
     ulCBCIVL:=ulCBCLeft;
     ulCBCIVR:=ulCBCRight;
     WriteLn('IV: ', ULONG2Hex(ulCBCIVL),
             ' ',    ULONG2Hex(ulCBCIVR));
     WriteLn('original data:');
     for unI:=1 to 6 do Write(ULONG2Hex(testbuf[unI]), '  ');
     WriteLn;
     WriteLn('encrypted data:');
     Blowfish_SetBoxes(@BF_key[1]);    { reload boxes }
     Blowfish_Init(@sMyKey[1], Length(sMyKey));
     Blowfish_CBCEncrypt(@testbuf[1], 6*4, ulCBCIVL, ulCBCIVR);
     for unI:=1 to 6 do Write(ULONG2Hex(testbuf[unI]), '  ');
     WriteLn;
     WriteLn('decrypted data :');
     { just do some overhead for provocation :) }
     sMyKey:='Damn, I''m looking good!Damn, I''m looking good!';
     Blowfish_SetBoxes(@BF_key[1]);
     Blowfish_Init(@sMyKey[1], Length(sMyKey));
     { decrypt in 2 parts to double check the TPU }
     ulCBCIVL:=ulCBCLeft;
     ulCBCIVR:=ulCBCRight;
     Blowfish_CBCDecrypt(@testbuf[1], 2*4, ulCBCIVL, ulCBCIVR);
     Blowfish_CBCDecrypt(@testbuf[3], 4*4, ulCBCIVL, ulCBCIVR);
     for unI:=1 to 6 do Write(ULONG2Hex(testbuf[unI]), '  ');
     WriteLn;
     { 32 rounds }
     Blowfish_SetRounds(32);
     ulCBCIVL  :=ulCBCLeft;
     ulCBCIVR  :=ulCBCRight;
     TextColor(10); WriteLn('CBC test, 32 rounds...'); TextColor(7);
     WriteLn('IV: ', ULONG2Hex(ulCBCIVL),
             ' ',    ULONG2Hex(ulCBCIVR));
     WriteLn('original data :');
     for unI:=1 to 6 do Write(ULONG2Hex(testbuf[unI]), '  ');
     WriteLn;
     WriteLn('encrypted data :');
     Blowfish_SetBoxes(@BF_key[1]);      { reload Boxes }
     sMyKey:='Damn, I''m looking good!';
     Blowfish_Init(@sMyKey[1], Length(sMyKey));
     Blowfish_CBCEncrypt(@testbuf[1], 6*4, ulCBCLeft, ulCBCRight);
     for unI:=1 to 6 do Write(ULONG2Hex(testbuf[unI]), '  ');
     WriteLn;
     WriteLn('decrypted data :');
     Blowfish_SetBoxes(@BF_key[1]);      { reload Boxes }
     Blowfish_Init(@sMyKey[1], Length(sMyKey));
     { decrypt in 2 parts to double check the correct reentry }
     Blowfish_CBCDecrypt(@testbuf[1], 2*4, ulCBCIVL, ulCBCIVR);
     Blowfish_CBCDecrypt(@testbuf[3], 4*4, ulCBCIVL, ulCBCIVR);
     for unI:=1 to 6 do Write(ULONG2Hex(testbuf[unI]), '  ');
     WriteLn; WriteLn;

    { benchmark, using CBC and a 32kB test buffer }
    New(biggy);
    TextColor(10); WriteLn('performance with 16 rounds...'); TextColor(7);
    Blowfish_SetRounds(16);
    GetTime(h,m,s,c);
    ulStart:=ULONG(h)*3600*100 + ULONG(m)*60*100 + ULONG(s)*100 + ULONG(c);
    for unI:=1 to TESTLOOPS do
      Blowfish_CBCEncrypt(@biggy^[1], BIGBUFSIZE, ulCBCLeft, ulCBCRight);
    GetTime(h,m,s,c);
    ulTime:=(ULONG(h)*3600*100 + ULONG(m)*60*100 + ULONG(s)*100 + ULONG(c))-ulStart;
    ulRate:=((TESTLOOPS*BIGBUFSIZE) div ulTime) * 100;
    WriteLn(ulRate,  ' bytes per second');

    TextColor(10); WriteLn('performance with 32 rounds...'); TextColor(7);
    Blowfish_SetRounds(32);
    GetTime(h,m,s,c);
    ulStart:=ULONG(h)*3600*100 + ULONG(m)*60*100 + ULONG(s)*100 + ULONG(c);
    for unI:=1 to TESTLOOPS do
      Blowfish_CBCEncrypt(@biggy^[1], BIGBUFSIZE, ulCBCLeft, ulCBCRight);
    GetTime(h,m,s,c);
    ulTime:=(ULONG(h)*3600*100 + ULONG(m)*60*100 + ULONG(s)*100 + ULONG(c))-ulStart;
    ulRate:=((TESTLOOPS*BIGBUFSIZE) div ulTime) * 100;
    WriteLn(ulRate,  ' bytes per second');

    Dispose(biggy);


    { check the weak key detector... }
    TextColor(10); WriteLn(#13#10+'weak key check...'); TextColor(7);

    Blowfish_SetRounds(16);
    Blowfish_GetBoxes(@BF_key);
    Blowfish_SetRounds(32);
    Blowfish_GetBoxes(@BF_keysave);

    Write('16 rounds: ', Blowfish_WeakKey);
    Blowfish_SetRounds(16);
    ulEqual:=Random32;
    BF_key[18+Random(1024)]:=ulEqual;
    BF_key[18+Random(1024)]:=ulEqual;
    Blowfish_SetBoxes(@BF_key);
    WriteLn(' ', Blowfish_WeakKey);

    Blowfish_SetRounds(32);
    Blowfish_SetBoxes(@BF_keysave);
    Write('32 rounds: ', Blowfish_WeakKey);
    ulEqual:=Random32;
    BF_keysave[18+Random(1024)]:=ulEqual;
    BF_keysave[18+Random(1024)]:=ulEqual;
    Blowfish_SetBoxes(@BF_keysave);
    WriteLn(' ', Blowfish_WeakKey);

    { do something funny,
      encrypt the screen... }

    WriteLn(#13#10,
            'We will now encrypt your video memory. If the flicker has'+#13#10,
            'stopped you must press a key to decrypt/restore it again.'+#13#10,
            'You''ll also saw some equal parts, a good example _not_ to'+#13#10,
            'use ECB but CBC :)'+#13#10#13#10,
            'press a key...');
    ReadKey;
    Blowfish_SetRounds(16);
    { assume 80x25 color textmode }
    pScreen:=Ptr($b800, 0);
    { Blowfish is so fast we do some extra loops for better animation here,
      not necessary in the real world, of course }
    for unI:=1 to SCRLOOPS do Blowfish_ECBEncrypt(pScreen, 4000);
    ReadKey;
    for unI:=1 to SCRLOOPS do Blowfish_ECBDecrypt(pScreen, 4000);
    WriteLn(#13#10+'That''s all folks!');


end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -