亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? rijndael_alg_ref.pas

?? Rijndael algorithm修正了CBC下BUG的版本(有源代碼)工作在:D5。作者:Sergey Kirichenko。
?? PAS
字號:
{* rijndael-alg-ref.c   v2.0   August '99 *}
(* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 *                ---------------------------------                *
 *                            DELPHI                               *
 *                Rijndael algorithm implementation                *
 *                ---------------------------------                *
 *                                                   December 2000 *
 *                                                                 *
 * Authors: Paulo Barreto                                          *
 *          Vincent Rijmen                                         *
 *                                                                 *
 * Delphi translation by Sergey Kirichenko (ksv@cheerful.com)      *
 * Home Page: http://rcolonel.tripod.com                           *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *)

unit rijndael_alg_ref;

interface

const
  MAXBC     = (256 div 32);
  MAXKC     = (256 div 32);
  MAXROUNDS = 14;

type
  word8  = byte;        // unsigned 8-bit
  word16 = word;        // unsigned 16-bit
  word32 = longword;    // unsigned 32-bit

  TArrayK  = array [0..4-1, 0..MAXKC-1] of word8;
  PArrayK = ^TArrayK;
  TArrayRK = array [0..MAXROUNDS+1-1, 0..4-1, 0..MAXBC-1] of word8;
  TArrayBox= array [0..256-1] of word8;


{ Calculate the necessary round keys
  The number of calculations depends on keyBits and blockBits }
function rijndaelKeySched(k: TArrayK; keyBits, blockBits: integer;
                          var W: TArrayRK): integer;

{ Encryption of one block. }
function rijndaelEncrypt(var a: TArrayK; keyBits, blockBits: integer; rk: TArrayRK): integer;

{ Encrypt only a certain number of rounds.
  Only used in the Intermediate Value Known Answer Test. }
function rijndaelEncryptRound(var a: TArrayK; keyBits, blockBits: integer;
		              rk: TArrayRK; var irounds: integer): integer;

{ Decryption of one block. }
function rijndaelDecrypt(var a: TArrayK; keyBits, blockBits: integer; rk: TArrayRK): integer;

{ Decrypt only a certain number of rounds.
  Only used in the Intermediate Value Known Answer Test.
  Operations rearranged such that the intermediate values
  of decryption correspond with the intermediate values
  of encryption. }
function rijndaelDecryptRound(var a: TArrayK; keyBits, blockBits: integer;
	                      rk: TArrayRK; var irounds: integer): integer;


implementation


{$include 'boxes-ref.dat.pas'} // Tables that are needed by the reference implementation.

const
  shifts: array [0..3-1, 0..4-1, 0..2-1] of word8 = (
    ((0, 0),(1, 3),(2, 2),(3, 1)),
    ((0, 0),(1, 5),(2, 4),(3, 3)),
    ((0, 0),(1, 7),(3, 5),(4, 4)));

function iif(bExpression: boolean; iResTrue,iResFalse: integer): integer;
begin
  if bExpression then
    result:= iResTrue
  else
    result:= iResFalse;
end;

function mul(a, b: word8): word8;
{ multiply two elements of GF(2^m)
  needed for MixColumn and InvMixColumn }
begin
  if (a<>0) and (b<>0) then
    result:= Alogtable[(Logtable[a] + Logtable[b]) mod 255]
  else
    result:= 0;
end;

procedure KeyAddition(var a: TArrayK; rk: PArrayK; BC:word8);
{ Exor corresponding text input and round key input bytes }
var
  i, j: integer;
begin
  for i:= 0 to 4-1 do
    for j:= 0 to BC-1 do
      a[i][j]:= a[i][j] xor rk[i][j];
end;

procedure ShiftRow(var a: TArrayK; d, BC: word8);
{ Row 0 remains unchanged
  The other three rows are shifted a variable amount }
var
  tmp: array [0..MAXBC-1] of word8;
  i, j: integer;
begin
  for i:= 1 to 4-1 do
    begin
      for j:= 0 to BC-1 do
        tmp[j]:= a[i][(j + shifts[((BC - 4) shr 1)][i][d]) mod BC];
      for j:= 0 to BC-1 do
        a[i][j]:= tmp[j];
    end;
end;

procedure Substitution(var a: TArrayK; const box: TArrayBox; BC: word8);
{ Replace every byte of the input by the byte at that place
 in the nonlinear S-box }
var
  i, j: integer;
begin
  for i:= 0 to 4-1 do
    for j:= 0 to BC-1 do
      a[i][j]:= box[a[i][j]];
end;

procedure MixColumn(var a: TArrayK; BC: word8);
{ Mix the four bytes of every column in a linear way }
var
  b: TArrayK;
  i, j: integer;
begin
  for j:= 0 to BC-1 do
    for i:= 0 to 4-1 do
      b[i][j]:= mul(2,a[i][j])
                 xor mul(3,a[(i + 1) mod 4][j])
                 xor a[(i + 2) mod 4][j]
                 xor a[(i + 3) mod 4][j];
  for i:= 0 to 4-1 do
    for j:= 0 to BC-1 do
      a[i][j]:= b[i][j];
end;

procedure InvMixColumn(var a: TArrayK; BC: word8);
{ Mix the four bytes of every column in a linear way
  This is the opposite operation of Mixcolumn }
var
  b: TArrayK;
  i, j: integer;
begin
  for j:= 0 to BC-1 do
    for i:= 0 to 4-1 do
      b[i][j]:= mul($e,a[i][j])
                 xor mul($b,a[(i + 1) mod 4][j])
                 xor mul($d,a[(i + 2) mod 4][j])
                 xor mul($9,a[(i + 3) mod 4][j]);
  for i:= 0 to 4-1 do
    for j:= 0 to BC-1 do
      a[i][j]:= b[i][j];
end;

function rijndaelKeySched(k: TArrayK; keyBits, blockBits: integer;
		          var W: TArrayRK): integer;
{ Calculate the necessary round keys
  The number of calculations depends on keyBits and blockBits }
var
  KC, BC, ROUNDS: integer;
  i, j, t, rconpointer: integer;
  tk: array [0..4-1, 0..MAXKC-1] of word8;
begin
  rconpointer:= 0;
  case (keyBits) of
    128: KC:= 4;
    192: KC:= 6;
    256: KC:= 8;
  else
    begin
      result:= -1;
      exit;
    end;
  end;

  case (blockBits) of
    128: BC:= 4;
    192: BC:= 6;
    256: BC:= 8;
  else
    begin
      result:= -2;
      exit;
    end;
  end;

  case iif(keyBits >= blockBits, keyBits, blockBits) of
    128: ROUNDS:= 10;
    192: ROUNDS:= 12;
    256: ROUNDS:= 14;
  else
    begin
      result:= -3;  {* this cannot happen *}
      exit;
    end;
  end;

  for j:= 0 to KC-1 do
    for i:= 0 to 4-1 do
      tk[i][j]:= k[i][j];

  { copy values into round key array }
  t:= 0;
  j:= 0;
  while ((j < KC) and (t < (ROUNDS+1)*BC)) do
    begin
      for i:= 0 to 4-1 do
        W[t div BC][i][t mod BC]:= tk[i][j];
      inc(j);
      inc(t);
    end;

  while (t < (ROUNDS+1)*BC) do { while not enough round key material calculated }
    begin
      { calculate new values }
      for i:= 0 to 4-1 do
        tk[i][0]:= tk[i][0] xor S[tk[(i+1) mod 4][KC-1]];
      tk[0][0]:= tk[0][0] xor rcon[rconpointer];
      inc(rconpointer);
      if (KC <> 8) then
        begin
          for j:= 1 to KC-1 do
            for i:= 0 to 4-1 do
              tk[i][j]:= tk[i][j] xor tk[i][j-1];
        end
      else
        begin
          j:= 1;
          while j < KC/2 do
            begin
              for i:= 0 to 4-1 do
                tk[i][j]:= tk[i][j] xor tk[i][j-1];
              inc(j);
            end;
          for i:= 0 to 4-1 do
            tk[i][KC div 2]:= tk[i][KC div 2] xor S[tk[i][(KC div 2) - 1]];
          j:= (KC div 2) + 1;
          while j < KC do
            begin
              for i:= 0 to 4-1 do
                tk[i][j]:= tk[i][j] xor tk[i][j-1];
              inc(j);
            end;
	      end;

      { copy values into round key array }
      j:= 0;
      while ((j < KC) and (t < (ROUNDS+1)*BC)) do
        begin
          for i:= 0 to 4-1 do
            W[t div BC][i][t mod BC]:= tk[i][j];
          inc(j);
          inc(t);
        end;
    end;
  result:= 0;
end;

function rijndaelEncrypt(var a: TArrayK; keyBits, blockBits: integer; rk: TArrayRK): integer;
{ Encryption of one block. }
var
  r, BC, ROUNDS: integer;
begin
  case (blockBits) of
    128: BC:= 4;
    192: BC:= 6;
    256: BC:= 8;
  else
    begin
      result:= -2;
      exit;
    end;
  end;

  case iif(keyBits >= blockBits, keyBits, blockBits) of
    128: ROUNDS:= 10;
    192: ROUNDS:= 12;
    256: ROUNDS:= 14;
  else
    begin
      result:= -3; { this cannot happen }
      exit;
    end;
  end;

  { begin with a key addition }
  KeyAddition(a,addr(rk[0]),BC);

  { ROUNDS-1 ordinary rounds }
  for r:= 1 to ROUNDS-1 do
    begin
      Substitution(a,S,BC);
      ShiftRow(a,0,BC);
      MixColumn(a,BC);
      KeyAddition(a,addr(rk[r]),BC);
    end;

  { Last round is special: there is no MixColumn }
  Substitution(a,S,BC);
  ShiftRow(a,0,BC);
  KeyAddition(a,addr(rk[ROUNDS]),BC);
  result:= 0;
end;

function rijndaelEncryptRound(var a: TArrayK; keyBits, blockBits: integer;
		              rk: TArrayRK; var irounds: integer): integer;
{ Encrypt only a certain number of rounds.
  Only used in the Intermediate Value Known Answer Test. }
var
  r, BC, ROUNDS: integer;
begin
  case (blockBits) of
    128: BC:= 4;
    192: BC:= 6;
    256: BC:= 8;
   else
     begin
       result:= -2;
       exit;
     end;
   end;

   case iif(keyBits >= blockBits, keyBits, blockBits) of
     128: ROUNDS:= 10;
     192: ROUNDS:= 12;
     256: ROUNDS:= 14;
   else
     begin
       result:= -3; { this cannot happen }
       exit;
     end;
   end;

  { make number of rounds sane }
  if (irounds > ROUNDS) then
    irounds:= ROUNDS;

  { begin with a key addition }
  KeyAddition(a,addr(rk[0]),BC);

  { at most ROUNDS-1 ordinary rounds }
  r:= 1;
  while (r <= irounds) and (r < ROUNDS) do
    begin
      Substitution(a,S,BC);
      ShiftRow(a,0,BC);
      MixColumn(a,BC);
      KeyAddition(a,addr(rk[r]),BC);
      inc(r);
    end;

  { if necessary, do the last, special, round: }
  if (irounds = ROUNDS) then
    begin
      Substitution(a,S,BC);
      ShiftRow(a,0,BC);
      KeyAddition(a,addr(rk[ROUNDS]),BC);
    end;

  result:= 0;
end;

function rijndaelDecrypt(var a: TArrayK; keyBits, blockBits: integer; rk: TArrayRK): integer;
var
  r, BC, ROUNDS: integer;
begin

  case (blockBits) of
    128: BC:= 4;
    192: BC:= 6;
    256: BC:= 8;
  else
    begin
      result:= -2;
      exit;
    end;
  end;

  case iif(keyBits >= blockBits, keyBits, blockBits) of
    128: ROUNDS:= 10;
    192: ROUNDS:= 12;
    256: ROUNDS:= 14;
  else
    begin
      result:= -3; { this cannot happen }
      exit;
    end;
  end;

  { To decrypt: apply the inverse operations of the encrypt routine,
    in opposite order

    (KeyAddition is an involution: it 's equal to its inverse)
    (the inverse of Substitution with table S is Substitution with the inverse table of S)
    (the inverse of Shiftrow is Shiftrow over a suitable distance) }

  { First the special round:
    without InvMixColumn
    with extra KeyAddition }
  KeyAddition(a,addr(rk[ROUNDS]),BC);
  Substitution(a,Si,BC);
  ShiftRow(a,1,BC);

  { ROUNDS-1 ordinary rounds }
  for r:= ROUNDS-1 downto 0+1 do
    begin
      KeyAddition(a,addr(rk[r]),BC);
      InvMixColumn(a,BC);
      Substitution(a,Si,BC);
      ShiftRow(a,1,BC);
    end;

  { End with the extra key addition }

  KeyAddition(a,addr(rk[0]),BC);
  result:= 0;
end;

function rijndaelDecryptRound(var a: TArrayK; keyBits, blockBits: integer;
	                      rk: TArrayRK; var irounds: integer): integer;
{ Decrypt only a certain number of rounds.
  Only used in the Intermediate Value Known Answer Test.
  Operations rearranged such that the intermediate values
  of decryption correspond with the intermediate values
  of encryption. }
var
  r, BC, ROUNDS: integer;
begin
  case (blockBits) of
    128: BC:= 4;
    192: BC:= 6;
    256: BC:= 8;
  else
    begin
      result:= -2;
      exit;
    end;
  end;

  case iif(keyBits >= blockBits, keyBits, blockBits) of
    128: ROUNDS:= 10;
    192: ROUNDS:= 12;
    256: ROUNDS:= 14;
  else
    begin
      result:= -3; { this cannot happen }
      exit;
    end;
  end;

  { make number of rounds sane }
  if (irounds > ROUNDS) then
    irounds:= ROUNDS;

  { First the special round:
    without InvMixColumn
    with extra KeyAddition }

  KeyAddition(a,addr(rk[ROUNDS]),BC);
  Substitution(a,Si,BC);
  ShiftRow(a,1,BC);

  { ROUNDS-1 ordinary rounds }
  for r:= ROUNDS-1 downto irounds+1 do
    begin
      KeyAddition(a,addr(rk[r]),BC);
      InvMixColumn(a,BC);
      Substitution(a,Si,BC);
      ShiftRow(a,1,BC);
    end;

  if (irounds = 0) then
    { End with the extra key addition }
    KeyAddition(a,addr(rk[0]),BC);

  result:= 0;
end;

end.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲成人自拍网| 国产盗摄一区二区三区| 欧美一区二区精美| 免费成人av资源网| 69堂成人精品免费视频| 毛片一区二区三区| 国产视频一区不卡| 99国产精品国产精品毛片| 亚洲精品日韩一| 欧美精品色综合| 精品一区二区三区在线视频| 国产亚洲综合在线| 97国产一区二区| 香蕉成人伊视频在线观看| 久久精品72免费观看| 亚洲精品一区二区三区福利| 国产成人av一区二区三区在线 | 18欧美亚洲精品| 在线看不卡av| 日韩不卡一二三区| 久久精品在线免费观看| 99re视频精品| 日日摸夜夜添夜夜添国产精品 | 自拍偷拍亚洲欧美日韩| 精品污污网站免费看| 九色综合狠狠综合久久| 国产精品久久久久久福利一牛影视 | 精品嫩草影院久久| 麻豆精品视频在线观看视频| 久久久久久日产精品| 色综合久久综合网97色综合| 日韩经典一区二区| 亚洲国产激情av| 欧美图区在线视频| 国产一区二区精品久久| 樱花影视一区二区| 日韩精品一区国产麻豆| 99热国产精品| 麻豆专区一区二区三区四区五区| 国产精品理伦片| 在线播放91灌醉迷j高跟美女 | 国产黄色91视频| 一区二区三区久久| 久久久亚洲国产美女国产盗摄| 一本色道久久综合狠狠躁的推荐| 蜜桃视频第一区免费观看| 国产精品短视频| 日韩欧美中文字幕公布| 色综合天天性综合| 精品系列免费在线观看| 夜夜嗨av一区二区三区中文字幕 | 欧亚一区二区三区| 国产精品乡下勾搭老头1| 亚洲综合久久av| 国产三级欧美三级| 91麻豆精品国产91久久久更新时间 | 欧美日韩在线亚洲一区蜜芽| 国产一区美女在线| 亚洲国产精品人人做人人爽| 日本一区二区三区dvd视频在线| 欧美日韩免费在线视频| 成人夜色视频网站在线观看| 免费成人av在线| 一区二区三区久久| 中文字幕欧美日韩一区| 日韩你懂的电影在线观看| 欧美在线你懂得| 成人激情文学综合网| 精品中文字幕一区二区| 亚洲一级二级三级| 1000部国产精品成人观看| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 国产午夜精品久久| 欧美一区二区三区在| 日本道精品一区二区三区 | 在线观看亚洲精品视频| 国产69精品久久99不卡| 久草在线在线精品观看| 丝袜美腿亚洲色图| 亚洲一区日韩精品中文字幕| 国产精品久久久久婷婷| 久久精品视频一区| 欧美xxxxx牲另类人与| 欧美精品乱码久久久久久按摩| 99精品黄色片免费大全| 成人午夜视频在线观看| 久久午夜老司机| 欧美一级日韩免费不卡| 欧美四级电影网| 91久久线看在观草草青青| 99天天综合性| 成人免费va视频| 国产成人av电影在线播放| 激情综合色综合久久综合| 男男视频亚洲欧美| 日韩国产欧美在线播放| 亚洲v精品v日韩v欧美v专区| 亚洲精品欧美二区三区中文字幕| 国产精品久久久久久久久图文区| 国产亚洲精品精华液| 久久老女人爱爱| 2023国产精品| ww久久中文字幕| 精品国产污网站| 欧美r级电影在线观看| 日韩欧美国产一区二区三区| 欧美一区二区三区四区在线观看| 欧美精品视频www在线观看 | 国产精品视频一二| 国产欧美日韩在线| 日本一二三不卡| 欧美高清在线精品一区| 中国av一区二区三区| 日本一区二区三区dvd视频在线| 国产一区三区三区| 国产成人午夜精品5599| 国产成人精品免费| 波多野结衣在线一区| 99v久久综合狠狠综合久久| 91麻豆国产福利精品| 色噜噜偷拍精品综合在线| 欧美伊人精品成人久久综合97| 欧美午夜一区二区| 欧美老年两性高潮| 日韩精品中文字幕在线不卡尤物 | 日韩欧美高清一区| 2017欧美狠狠色| 欧美韩国日本不卡| 中文字幕一区在线观看| 一区二区三区在线视频免费| 亚洲综合清纯丝袜自拍| 日韩成人av影视| 国产在线视视频有精品| 高清av一区二区| 色综合久久精品| 欧美日韩一本到| 日韩欧美成人午夜| 国产亚洲欧美色| 亚洲精品ww久久久久久p站| 亚洲国产精品麻豆| 久色婷婷小香蕉久久| 国产成人在线观看免费网站| 成人免费在线视频观看| 一区二区三区四区乱视频| 五月婷婷色综合| 九色综合狠狠综合久久| av中文字幕不卡| 欧美日韩视频在线观看一区二区三区| 欧美一区二区视频在线观看2022| 久久久久久毛片| 亚洲视频一区在线| 日韩高清在线不卡| 国产风韵犹存在线视精品| 色婷婷综合久久久久中文一区二区| 欧美麻豆精品久久久久久| 精品国产欧美一区二区| 亚洲欧洲日韩av| 日韩激情一二三区| 丰满少妇在线播放bd日韩电影| 91高清在线观看| 精品剧情v国产在线观看在线| 中文字幕国产一区二区| 亚洲成年人影院| 国产精品一区二区三区网站| 色偷偷成人一区二区三区91| 日韩欧美国产精品| 亚洲色图在线视频| 蜜桃免费网站一区二区三区| av亚洲精华国产精华精华| 欧美日韩aaa| 中文字幕第一区第二区| 天堂一区二区在线| 丁香六月综合激情| 91精品国产综合久久久久久| 国产精品午夜久久| 日本美女一区二区三区| 9久草视频在线视频精品| 日韩精品一区二| 亚洲精品国产无天堂网2021 | 精品欧美久久久| 一区二区不卡在线播放 | 精品在线一区二区三区| 色噜噜狠狠色综合中国| 久久综合狠狠综合久久激情| 亚洲综合色丁香婷婷六月图片| 国产成人亚洲精品狼色在线| 欧美区视频在线观看| 国产精品久久毛片av大全日韩| 蜜桃视频在线观看一区二区| 91免费小视频| 国产亚洲一本大道中文在线| 日韩一区精品视频| 99久久精品国产一区二区三区 | 欧美一级日韩不卡播放免费| 亚洲欧美国产毛片在线| 国产精品自拍av| 91精品国产91久久久久久一区二区 | 91看片淫黄大片一级| 国产亚洲综合性久久久影院| 日韩国产一区二|