November 28, 2020, 11:23:58 AM

Author Topic: [bmx] TCrypt by Firstdeathmaker [ 1+ years ago ]  (Read 485 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
[bmx] TCrypt by Firstdeathmaker [ 1+ years ago ]
« on: June 29, 2017, 12:28:41 AM »
Title : TCrypt
Author : Firstdeathmaker
Posted : 1+ years ago

Description : This Collection provides easy-to use stream encryption with Xor or AES.

Code :
Code: BlitzMax
  1. Rem
  2.         Easy Cryptography module by Christian Gei�ler (c) 2008
  3.         about: delivers easy to use encryption and decryption classes for bmax.
  4.        
  5.         Version 1.2
  6.         - added TAesCrypt      
  7.  
  8.         Version 1.0
  9.         - added TXorCrypt
  10.         - added TCrypt Interface
  11.  
  12.  
  13.        
  14. End Rem
  15.  
  16.  
  17.  
  18.  
  19. Rem
  20.         bbdoc: Interface for encryption / decryption types
  21. End Rem
  22.  
  23. Type TCrypt Abstract
  24.        
  25.         Rem
  26.                 bbdoc: ciphers a stream into another with the specified KEY
  27.                 also: setKey()
  28.         End Rem
  29.         Method cipher(in:TStream , out:TStream) Abstract
  30.                
  31.         Rem
  32.                 bbdoc: deciphers a stream into another with the specified KEY
  33.                 also: setKey()
  34.         End Rem
  35.         Method decipher(in:TStream , out:TStream) Abstract
  36.                
  37.         Rem
  38.                 bbdoc: sets the key for this encryption type
  39.         End Rem
  40.         Method setKey(key:String) Abstract
  41.  
  42. End Type
  43.  
  44.  
  45.  
  46. Rem
  47.         bbdoc: Weak encryption type, uses XOR to encrypt files.
  48. End Rem
  49.  
  50. Type TXorCrypt Extends TCrypt Final
  51.         Field key:Int
  52.        
  53.         Method cipher(in:TStream , out:TStream)
  54.                 If in=Null Or out = Null Return
  55.                 While Not Eof(in)
  56.                         WriteInt(out,(ReadInt(in) ~ Self.key))
  57.                 Wend
  58.         End Method
  59.                
  60.  
  61.         Method decipher(in:TStream , out:TStream)
  62.                 If in = Null Or out = Null Return
  63.                 Self.cipher(in,out)
  64.         End Method
  65.                
  66.  
  67.         Method setKey(key:String)
  68.                 Self.key = Int(key)
  69.         End Method
  70. End Type
  71.  
  72.  
  73. Type TAESCrypt Extends TCrypt Final
  74.  
  75.         'SECURITY RELEVANT VAR's, need to be cleared after algorithm was performed
  76.         Field Key:String
  77.         Field expKey:Byte[,]
  78.         Field State:Byte[,]
  79.         'SECURITY VAR's end
  80.        
  81.         Field Nk:Byte 'choose between 4, 6 or 8, Keysize
  82.         Field Nb:Byte 'choose between 4, 6 or 8, Blocksize
  83.        
  84.         Method New()
  85.                 Self.Nk = 4
  86.                 Self.Nb = 4
  87.         End Method
  88.  
  89.         Method init()
  90.                 calcNr()
  91.                 keyExpansion()
  92.                 Self.State = New Byte[4, Self.Nb]
  93.         End Method
  94.        
  95.         Field Nr:Byte
  96.         Method calcNr()
  97.                 If Self.Nb = 8
  98.                         Nr = 14
  99.                 ElseIf Self.Nb = 6
  100.                         If Self.Nk < 8
  101.                                 Nr = 12
  102.                         Else
  103.                                 Nr = 14
  104.                         EndIf
  105.                 Else
  106.                         If Self.Nk < 6
  107.                                 Nr = 10
  108.                         ElseIf Self.Nk < 8
  109.                                 Nr = 12
  110.                         Else
  111.                                 Nr = 14
  112.                         EndIf
  113.                 EndIf
  114.         End Method
  115.        
  116.         '256
  117.         Field sBox:Byte[] =    [Byte($63), Byte($7c), Byte($77), Byte($7b), Byte($f2), Byte($6b), Byte($6f), Byte($c5), Byte($30), Byte($01), Byte($67), Byte($2b), Byte($fe), Byte($d7), Byte($ab), Byte($76),Byte($ca), Byte($82), Byte($c9), Byte($7d), Byte($fa), Byte($59), Byte($47), Byte($f0), Byte($ad), Byte($d4), Byte($a2), Byte($af), Byte($9c), Byte($a4), Byte($72), Byte($c0),Byte($b7), Byte($fd), Byte($93), Byte($26), Byte($36), Byte($3f), Byte($f7), Byte($cc), Byte($34), Byte($a5), Byte($e5), Byte($f1), Byte($71), Byte($d8), Byte($31), Byte($15),Byte($04), Byte($c7), Byte($23), Byte($c3), Byte($18), Byte($96), Byte($05), Byte($9a), Byte($07), Byte($12), Byte($80), Byte($e2), Byte($eb), Byte($27), Byte($b2), Byte($75),Byte($09), Byte($83), Byte($2c), Byte($1a), Byte($1b), Byte($6e), Byte($5a), Byte($a0), Byte($52), Byte($3b), Byte($d6), Byte($b3), Byte($29), Byte($e3), Byte($2f), Byte($84),Byte($53), Byte($d1), Byte($00), Byte($ed), Byte($20), Byte($fc), Byte($b1), Byte($5b), Byte($6a), Byte($cb), Byte($be), Byte($39), Byte($4a), Byte($4c), Byte($58), Byte($cf),Byte($d0), Byte($ef), Byte($aa), Byte($fb), Byte($43), Byte($4d), Byte($33), Byte($85), Byte($45), Byte($f9), Byte($02), Byte($7f), Byte($50), Byte($3c), Byte($9f), Byte($a8),Byte($51), Byte($a3), Byte($40), Byte($8f), Byte($92), Byte($9d), Byte($38), Byte($f5), Byte($bc), Byte($b6), Byte($da), Byte($21), Byte($10), Byte($ff), Byte($f3), Byte($d2),Byte($cd), Byte($0c), Byte($13), Byte($ec), Byte($5f), Byte($97), Byte($44), Byte($17), Byte($c4), Byte($a7), Byte($7e), Byte($3d), Byte($64), Byte($5d), Byte($19), Byte($73),Byte($60), Byte($81), Byte($4f), Byte($dc), Byte($22), Byte($2a), Byte($90), Byte($88), Byte($46), Byte($ee), Byte($b8), Byte($14), Byte($de), Byte($5e), Byte($0b), Byte($db),Byte($e0), Byte($32), Byte($3a), Byte($0a), Byte($49), Byte($06), Byte($24), Byte($5c), Byte($c2), Byte($d3), Byte($ac), Byte($62), Byte($91), Byte($95), Byte($e4), Byte($79),Byte($e7), Byte($c8), Byte($37), Byte($6d), Byte($8d), Byte($d5), Byte($4e), Byte($a9), Byte($6c), Byte($56), Byte($f4), Byte($ea), Byte($65), Byte($7a), Byte($ae), Byte($08),Byte($ba), Byte($78), Byte($25), Byte($2e), Byte($1c), Byte($a6), Byte($b4), Byte($c6), Byte($e8), Byte($dd), Byte($74), Byte($1f), Byte($4b), Byte($bd), Byte($8b), Byte($8a),Byte($70), Byte($3e), Byte($b5), Byte($66), Byte($48), Byte($03), Byte($f6), Byte($0e), Byte($61), Byte($35), Byte($57), Byte($b9), Byte($86), Byte($c1), Byte($1d), Byte($9e),Byte($e1), Byte($f8), Byte($98), Byte($11), Byte($69), Byte($d9), Byte($8e), Byte($94), Byte($9b), Byte($1e), Byte($87), Byte($e9), Byte($ce), Byte($55), Byte($28), Byte($df),Byte($8c), Byte($a1), Byte($89), Byte($0d), Byte($bf), Byte($e6), Byte($42), Byte($68), Byte($41), Byte($99), Byte($2d), Byte($0f), Byte($b0), Byte($54), Byte($bb), Byte($16)]
  118.         Field sBoxInvert:Byte[] = [Byte($52), Byte($09), Byte($6a), Byte($d5), Byte($30), Byte($36), Byte($a5), Byte($38), Byte($bf), Byte($40), Byte($a3), Byte($9e), Byte($81), Byte($f3), Byte($d7), Byte($fb), Byte($7c), Byte($e3), Byte($39), Byte($82), Byte($9b), Byte($2f), Byte($ff), Byte($87), Byte($34), Byte($8e), Byte($43), Byte($44), Byte($c4), Byte($de), Byte($e9), Byte($cb),Byte($54), Byte($7b), Byte($94), Byte($32), Byte($a6), Byte($c2), Byte($23), Byte($3d), Byte($ee), Byte($4c), Byte($95), Byte($0b), Byte($42), Byte($fa), Byte($c3), Byte($4e),Byte($08), Byte($2e), Byte($a1), Byte($66), Byte($28), Byte($d9), Byte($24), Byte($b2), Byte($76), Byte($5b), Byte($a2), Byte($49), Byte($6d), Byte($8b), Byte($d1), Byte($25),Byte($72), Byte($f8), Byte($f6), Byte($64), Byte($86), Byte($68), Byte($98), Byte($16), Byte($d4), Byte($a4), Byte($5c), Byte($cc), Byte($5d), Byte($65), Byte($b6), Byte($92),Byte($6c), Byte($70), Byte($48), Byte($50), Byte($fd), Byte($ed), Byte($b9), Byte($da), Byte($5e), Byte($15), Byte($46), Byte($57), Byte($a7), Byte($8d), Byte($9d), Byte($84),Byte($90), Byte($d8), Byte($ab), Byte($00), Byte($8c), Byte($bc), Byte($d3), Byte($0a), Byte($f7), Byte($e4), Byte($58), Byte($05), Byte($b8), Byte($b3), Byte($45), Byte($06),Byte($d0), Byte($2c), Byte($1e), Byte($8f), Byte($ca), Byte($3f), Byte($0f), Byte($02), Byte($c1), Byte($af), Byte($bd), Byte($03), Byte($01), Byte($13), Byte($8a), Byte($6b),Byte($3a), Byte($91), Byte($11), Byte($41), Byte($4f), Byte($67), Byte($dc), Byte($ea), Byte($97), Byte($f2), Byte($cf), Byte($ce), Byte($f0), Byte($b4), Byte($e6), Byte($73),Byte($96), Byte($ac), Byte($74), Byte($22), Byte($e7), Byte($ad), Byte($35), Byte($85), Byte($e2), Byte($f9), Byte($37), Byte($e8), Byte($1c), Byte($75), Byte($df), Byte($6e),Byte($47), Byte($f1), Byte($1a), Byte($71), Byte($1d), Byte($29), Byte($c5), Byte($89), Byte($6f), Byte($b7), Byte($62), Byte($0e), Byte($aa), Byte($18), Byte($be), Byte($1b),Byte($fc), Byte($56), Byte($3e), Byte($4b), Byte($c6), Byte($d2), Byte($79), Byte($20), Byte($9a), Byte($db), Byte($c0), Byte($fe), Byte($78), Byte($cd), Byte($5a), Byte($f4),Byte($1f), Byte($dd), Byte($a8), Byte($33), Byte($88), Byte($07), Byte($c7), Byte($31), Byte($b1), Byte($12), Byte($10), Byte($59), Byte($27), Byte($80), Byte($ec), Byte($5f),Byte($60), Byte($51), Byte($7f), Byte($a9), Byte($19), Byte($b5), Byte($4a), Byte($0d), Byte($2d), Byte($e5), Byte($7a), Byte($9f), Byte($93), Byte($c9), Byte($9c), Byte($ef),Byte($a0), Byte($e0), Byte($3b), Byte($4d), Byte($ae), Byte($2a), Byte($f5), Byte($b0), Byte($c8), Byte($eb), Byte($bb), Byte($3c), Byte($83), Byte($53), Byte($99), Byte($61),Byte($17), Byte($2b), Byte($04), Byte($7e), Byte($ba), Byte($77), Byte($d6), Byte($26), Byte($e1), Byte($69), Byte($14), Byte($63), Byte($55), Byte($21), Byte($0c), Byte($7d)]
  119.         '255
  120.         Field Rcon:Byte[] = [Byte($8d), Byte($01), Byte($02), Byte($04), Byte($08), Byte($10), Byte($20), Byte($40), Byte($80), Byte($1b), Byte($36), Byte($6c), Byte($d8),Byte($ab), Byte($4d), Byte($9a), Byte($2f), Byte($5e), Byte($bc), Byte($63), Byte($c6), Byte($97), Byte($35), Byte($6a), Byte($d4), Byte($b3),Byte($7d), Byte($fa), Byte($ef), Byte($c5), Byte($91), Byte($39), Byte($72), Byte($e4), Byte($d3), Byte($bd), Byte($61), Byte($c2), Byte($9f),Byte($25), Byte($4a), Byte($94), Byte($33), Byte($66), Byte($cc), Byte($83), Byte($1d), Byte($3a), Byte($74), Byte($e8), Byte($cb), Byte($8d),Byte($01), Byte($02), Byte($04), Byte($08), Byte($10), Byte($20), Byte($40), Byte($80), Byte($1b), Byte($36), Byte($6c), Byte($d8), Byte($ab),Byte($4d), Byte($9a), Byte($2f), Byte($5e), Byte($bc), Byte($63), Byte($c6), Byte($97), Byte($35), Byte($6a), Byte($d4), Byte($b3), Byte($7d),Byte($fa), Byte($ef), Byte($c5), Byte($91), Byte($39), Byte($72), Byte($e4), Byte($d3), Byte($bd), Byte($61), Byte($c2), Byte($9f), Byte($25),Byte($4a), Byte($94), Byte($33), Byte($66), Byte($cc), Byte($83), Byte($1d), Byte($3a), Byte($74), Byte($e8), Byte($cb), Byte($8d), Byte($01),Byte($02), Byte($04), Byte($08), Byte($10), Byte($20), Byte($40), Byte($80), Byte($1b), Byte($36), Byte($6c), Byte($d8), Byte($ab), Byte($4d),Byte($9a), Byte($2f), Byte($5e), Byte($bc), Byte($63), Byte($c6), Byte($97), Byte($35), Byte($6a), Byte($d4), Byte($b3), Byte($7d), Byte($fa),Byte($ef), Byte($c5), Byte($91), Byte($39), Byte($72), Byte($e4), Byte($d3), Byte($bd), Byte($61), Byte($c2), Byte($9f), Byte($25), Byte($4a),Byte($94), Byte($33), Byte($66), Byte($cc), Byte($83), Byte($1d), Byte($3a), Byte($74), Byte($e8), Byte($cb), Byte($8d), Byte($01), Byte($02),Byte($04), Byte($08), Byte($10), Byte($20), Byte($40), Byte($80), Byte($1b), Byte($36), Byte($6c), Byte($d8), Byte($ab), Byte($4d), Byte($9a),Byte($2f), Byte($5e), Byte($bc), Byte($63), Byte($c6), Byte($97), Byte($35), Byte($6a), Byte($d4), Byte($b3), Byte($7d), Byte($fa), Byte($ef),Byte($c5), Byte($91), Byte($39), Byte($72), Byte($e4), Byte($d3), Byte($bd), Byte($61), Byte($c2), Byte($9f), Byte($25), Byte($4a), Byte($94),Byte($33), Byte($66), Byte($cc), Byte($83), Byte($1d), Byte($3a), Byte($74), Byte($e8), Byte($cb), Byte($8d), Byte($01), Byte($02), Byte($04),Byte($08), Byte($10), Byte($20), Byte($40), Byte($80), Byte($1b), Byte($36), Byte($6c), Byte($d8), Byte($ab), Byte($4d), Byte($9a), Byte($2f),Byte($5e), Byte($bc), Byte($63), Byte($c6), Byte($97), Byte($35), Byte($6a), Byte($d4), Byte($b3), Byte($7d), Byte($fa), Byte($ef), Byte($c5),Byte($91), Byte($39), Byte($72), Byte($e4), Byte($d3), Byte($bd), Byte($61), Byte($c2), Byte($9f), Byte($25), Byte($4a), Byte($94), Byte($33),Byte($66), Byte($cc), Byte($83), Byte($1d), Byte($3a), Byte($74), Byte($e8), Byte($cb)]
  121.  
  122.        
  123.  
  124.         Method galois_multiplication:Byte(a:Byte , b:Byte)
  125.                 Local p:Byte
  126.                 Local hi_bit_set:Byte
  127.                
  128.                 For Local counter:Byte = 0 To 7
  129.                         If (b & 1) = 1 p:~ a
  130.                        
  131.                         hi_bit_set = a ~ $80
  132.                         a = a Shl 1
  133.                        
  134.                         If hi_bit_set = $80 a:~ $1b
  135.                         b = b Shr 1
  136.                 Next   
  137.                 Return p
  138.         End Method
  139.  
  140.         Method gm:Byte(a:Byte , b:Byte)
  141.                 Return galois_multiplication(a , b)
  142.         End Method
  143.  
  144.        
  145.         Rem
  146.                 bbdoc: calculates the expanded key from the normal key.
  147.         End Rem
  148.         Method keyExpansion:Byte()
  149.                 Local expKeySize:Int = Self.Nb * (Self.Nr + 1)
  150.                 DebugLog "expand key to " + expKeySize + " with " + Nr + " Nr."
  151.                 Self.expKey = New Byte[4, expKeySize]
  152.                 'fill array...
  153.                 Local keyTmp:String = Self.Key
  154.                 For Local i:Int = 0 Until Self.Nk
  155.                         Self.expKey[0, i] = Asc(keyTmp)
  156.                         keyTmp = Mid(keyTmp, 1)
  157.                         Self.expKey[1, i] = Asc(keyTmp)
  158.                         keyTmp = Mid(keyTmp, 1)
  159.                         Self.expKey[2, i] = Asc(keyTmp)
  160.                         keyTmp = Mid(keyTmp, 1)
  161.                         Self.expKey[3, i] = Asc(keyTmp)
  162.                         keyTmp = Mid(keyTmp, 1)
  163.                 Next
  164.                 Local round:Byte = 0
  165.                 For Local i:Int = Self.Nk Until expKeySize
  166.                         If (i Mod Self.Nk) > 0
  167.                                 Self.expKey[0, i] = Self.expKey[0, i - 1] ~ Self.expKey[0, i - Self.Nb]
  168.                                 Self.expKey[1, i] = Self.expKey[1, i - 1] ~ Self.expKey[1, i - Self.Nb]
  169.                                 Self.expKey[2, i] = Self.expKey[2, i - 1] ~ Self.expKey[2, i - Self.Nb]
  170.                                 Self.expKey[3, i] = Self.expKey[3, i - 1] ~ Self.expKey[3, i - Self.Nb]
  171.                         Else
  172.                                 round:+1
  173.                                 Local tmpWord:Byte[] = [Self.expKey[0, i - 1], Self.expKey[1, i - 1], Self.expKey[2, i - 1], Self.expKey[3, i - 1] ]
  174.                                 tmpWord = Self.rotWord(tmpWord)
  175.                                 tmpWord = Self.subWord(tmpWord)
  176.                                 tmpWord[0] = Self.rCon[round] ~ tmpWord[0]
  177.                                
  178.                                 Self.expKey[0, i] = tmpWord[0]
  179.                                 Self.expKey[1, i] = tmpWord[1]
  180.                                 Self.expKey[2, i] = tmpWord[2]
  181.                                 Self.expKey[3, i] = tmpWord[3]
  182.                         EndIf
  183.                 Next
  184.         End Method
  185.        
  186.         Rem
  187.                 bbdoc: support function for keyExpansion.
  188.                 about: Rotates a word 1 to the left
  189.         end rem
  190.         Method rotWord:Byte[] (word:Byte[])
  191.                 Local tmp:Byte = word[0]
  192.                 word[0] = word[1]
  193.                 word[1] = word[2]
  194.                 word[2] = word[3]
  195.                 word[3] = tmp
  196.                 Return word
  197.         End Method
  198.        
  199.         Rem
  200.                 bbdoc: support function for keyExpansion.
  201.                 about: substitutes bytes with sBox entries.
  202.         end rem
  203.         Method subWord:Byte[] (word:Byte[])
  204.                 word[0] = Self.sBox[word[0] ]
  205.                 word[1] = Self.sBox[word[1] ]
  206.                 word[2] = Self.sBox[word[2] ]
  207.                 word[3] = Self.sBox[word[3] ]
  208.                 Return word
  209.         End Method
  210.        
  211.        
  212.        
  213.         'cipher methods
  214.        
  215.         Method rijndael()
  216.                 addRoundKey(0)
  217.                 For Local i:Int = 1 Until Self.Nr
  218.                         round(i)
  219.                 Next
  220.                 finalRound()
  221.         End Method
  222.        
  223.         Method inv_rijndael()
  224.                 addRoundKey(Self.nr)
  225.                 For Local i:Int = 1 Until Self.Nr
  226.                         inv_round(i)
  227.                 Next
  228.                 inv_finalRound()
  229.         End Method
  230.        
  231.  
  232.         '#####################################
  233.         Method round(nr:Int)
  234.                 byteSub()
  235.                 shiftRow()
  236.                 mixColumns()
  237.                 addRoundKey(nr)
  238.         End Method
  239.        
  240.         Method inv_round(nr:Int)
  241.                 inv_shiftRow()
  242.                 inv_byteSub()
  243.                 addRoundKey(Self.nr - nr)
  244.                 inv_mixColumns()
  245.         End Method
  246.         '###############################
  247.        
  248.         Method finalRound()
  249.                 byteSub()
  250.                 shiftRow()
  251.                 addRoundKey(Self.Nr)
  252.         End Method
  253.  
  254.         Method inv_finalRound()
  255.                 inv_shiftRow()
  256.                 inv_byteSub()
  257.                 addRoundKey(0)
  258.         End Method
  259.  
  260.  
  261.         Rem
  262.                 bbdoc: adds the round-key to the current state-block
  263.         End Rem
  264.         Method addRoundKey(roundnr:Byte)
  265.                 roundnr:*Self.Nb
  266.                 Local newState:Byte[4, Self.Nb]
  267.                 For Local i:Byte = 0 Until Self.Nb
  268.                         newState[0, i] = State[0, i] ~ expKey[0, i + roundnr]
  269.                         newState[1, i] = State[1, i] ~ expKey[1, i + roundnr]
  270.                         newState[2, i] = State[2, i] ~ expKey[2, i + roundnr]
  271.                         newState[3, i] = State[3, i] ~ expKey[3, i + roundnr]
  272.                 Next
  273.                 Self.State = newState
  274.         End Method
  275.        
  276.         Rem
  277.                 bbdoc: substitutes the state-bytes with values in the s-box
  278.         end rem
  279.         Method byteSub()
  280.                 For Local i:Int = 0 Until Nb
  281.                         Self.State[0, i] = sBox[Self.State[0, i] ]
  282.                         Self.State[1, i] = sBox[Self.State[1, i] ]
  283.                         Self.State[2, i] = sBox[Self.State[2, i] ]
  284.                         Self.State[3, i] = sBox[Self.State[3, i] ]
  285.                 Next
  286.         End Method
  287.        
  288.         Rem
  289.                 bbdoc: substitutes the state-bytes with values in the s-box
  290.         end rem
  291.         Method inv_byteSub()
  292.                 For Local i:Int = 0 Until Nb
  293.                         Self.State[0, i] = sBoxInvert[Self.State[0, i] ]
  294.                         Self.State[1, i] = sBoxInvert[Self.State[1, i] ]
  295.                         Self.State[2, i] = sBoxInvert[Self.State[2, i] ]
  296.                         Self.State[3, i] = sBoxInvert[Self.State[3, i] ]
  297.                 Next
  298.         End Method
  299.        
  300.        
  301.         Method shiftRow()
  302.                 Local newState:Byte[4, Self.Nk]
  303.                 If Self.Nb = 4 Or Self.Nb = 6
  304.                         For Local i:Byte = 0 Until Self.Nk
  305.                                 newState[0,i] = State[0,i]
  306.                                 newState[1, i] = State[1, ((i + 1) Mod Self.Nk)]
  307.                                 newState[2, i] = State[2, ((i + 2) Mod Self.Nk)]
  308.                                 newState[3, i] = State[3, ((i + 3) Mod Self.Nk)]
  309.                         Next
  310.                 Else
  311.                         For Local i:Byte = 0 Until Self.Nk
  312.                                 newState[0,i] = State[0,i]
  313.                                 newState[1, i] = State[1, ((i + 1) Mod Self.Nk)]
  314.                                 newState[2, i] = State[2, ((i + 3) Mod Self.Nk)]
  315.                                 newState[3, i] = State[3, ((i + 4) Mod Self.Nk)]
  316.                         Next
  317.                 EndIf
  318.                 Self.State = newState
  319.         End Method
  320.        
  321.         Method inv_shiftRow()
  322.                 Local newState:Byte[4, Self.Nk]
  323.                 If Self.Nb = 4 Or Self.Nb = 6
  324.                         For Local i:Byte = 0 Until Self.Nk
  325.                                 newState[0,i] = State[0,i]
  326.                                 newState[1, ((i + 1) Mod Self.Nk)] = State[1, i]
  327.                                 newState[2, ((i + 2) Mod Self.Nk)] = State[2, i]
  328.                                 newState[3, ((i + 3) Mod Self.Nk)] = State[3, i]
  329.                         Next
  330.                 Else
  331.                         For Local i:Byte = 0 Until Self.Nk
  332.                                 newState[0,i] = State[0,i]
  333.                                 newState[1, ((i + 1) Mod Self.Nk)] = State[1, i]
  334.                                 newState[2, ((i + 3) Mod Self.Nk)] = State[2, i]
  335.                                 newState[3, ((i + 4) Mod Self.Nk)] = State[3, i]
  336.                         Next
  337.                 EndIf
  338.                 Self.State = newState
  339.         End Method
  340.        
  341.        
  342.         Rem
  343.                 bbdoc: rotates row of specified state block n to the right
  344.         end rem
  345.         Method mixColumns()
  346.                 Local newState:Byte[4, Self.Nk]
  347.                 For Local i:Byte = 0 Until Self.Nk
  348.                         newState[0, i] = gm(2,State[0, i]) ~ gm(3,State[1, i]) ~ gm(1,State[2, i]) ~ gm(1,State[3, i])
  349.                         newState[1, i] = gm(1,State[0, i]) ~ gm(2,State[1, i]) ~ gm(3,State[2, i]) ~ gm(1,State[3, i])
  350.                         newState[2, i] = gm(1,State[0, i]) ~ gm(1,State[1, i]) ~ gm(2,State[2, i]) ~ gm(3,State[3, i])
  351.                         newState[3, i] = gm(3,State[0, i]) ~ gm(1,State[1, i]) ~ gm(1,State[2, i]) ~ gm(2,State[3, i])
  352.                 Next
  353.                 Self.State = newState
  354.         End Method
  355.        
  356.         Rem
  357.                 bbdoc: rotates row of specified state block n to the right
  358.         end rem
  359.         Method inv_mixColumns()
  360.                 Local newState:Byte[4, Self.Nk]
  361.                 For Local i:Byte = 0 Until Self.Nk
  362.                         newState[0, i] = gm($0e , State[0, i]) ~ gm($0b , State[1, i]) ~ gm($0d , State[2, i]) ~ gm($09 , State[3, i])
  363.                         newState[1, i] = gm($09 , State[0, i]) ~ gm($0e , State[1, i]) ~ gm($0b , State[2, i]) ~ gm($0d , State[3, i])
  364.                         newState[2, i] = gm($0d , State[0, i]) ~ gm($09 , State[1, i]) ~ gm($0e , State[2, i]) ~ gm($0b , State[3, i])
  365.                         newState[3, i] = gm($0b , State[0, i]) ~ gm($0d , State[1, i]) ~ gm($09 , State[2, i]) ~ gm($0e , State[3, i])
  366.                 Next
  367.                 Self.State = newState
  368.         End Method
  369.        
  370.        
  371.         Method cipher(in:TStream, out:TStream)
  372.                 DebugLog "cipher with AES, init"
  373.                 Self.Init()
  374.                
  375.                 If Self.Nb = 0
  376.                         DebugLog "Nb = 0!"
  377.                         Return
  378.                 EndIf
  379.  
  380.                
  381.                 While Not Eof(in)
  382.                         For Local i:Int = 0 Until Self.Nb
  383.                                 Self.State[0, i] = ReadByte(in)
  384.                                 Self.State[1, i] = ReadByte(in)
  385.                                 Self.State[2, i] = ReadByte(in)
  386.                                 Self.State[3, i] = ReadByte(in)
  387.                         Next
  388.                         Self.rijndael()
  389.                         For Local i:Int = 0 Until Self.Nb      
  390.                                 WriteByte(out, Self.State[0, i])
  391.                                 WriteByte(out, Self.State[1, i])
  392.                                 WriteByte(out, Self.State[2, i])
  393.                                 WriteByte(out ,Self.State[3 ,i])
  394.                         Next
  395.                 Wend
  396.         End Method
  397.                
  398.         Method decipher(in:TStream, out:TStream)
  399.                 DebugLog "decipher with AES, init"
  400.                 Self.Init()
  401.                
  402.                 If Self.Nb = 0
  403.                         DebugLog "Nb = 0!"
  404.                         Return
  405.                 EndIf
  406.                
  407.                 While Not Eof(in)
  408.                         For Local i:Int = 0 Until Self.Nb
  409.                                 Self.State[0, i] = ReadByte(in)
  410.                                 Self.State[1, i] = ReadByte(in)
  411.                                 Self.State[2, i] = ReadByte(in)
  412.                                 Self.State[3, i] = ReadByte(in)
  413.                         Next
  414.                         Self.inv_rijndael()
  415.                         For Local i:Int = 0 Until Self.Nb
  416.                                 WriteByte(out, Self.State[0, i])
  417.                                 WriteByte(out, Self.State[1, i])
  418.                                 WriteByte(out, Self.State[2, i])
  419.                                 WriteByte(out, Self.State[3, i])
  420.                         Next
  421.                 Wend
  422.         End Method
  423.        
  424.         Method setKey(key:String)
  425.                 Self.Key = Key
  426.         End Method
  427. End Type


Comments :


Nate the Great(Posted 1+ years ago)

 sorry I don't have bmax so I can't run it but I looked over it and I kinda understand bmax... It looks very similar to one of my old bb2d encrypting programs and it looks useful :)


 

SimplePortal 2.3.6 © 2008-2014, SimplePortal