Skip to content

Instantly share code, notes, and snippets.

@jinleileiking
Created July 5, 2010 04:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save jinleileiking/464009 to your computer and use it in GitHub Desktop.
Save jinleileiking/464009 to your computer and use it in GitHub Desktop.
Ruby 3Des
require 'lib/ruby-des'
class TDES
class << self
def en_des plain, key
ret = ''
blocks = plain.scan(/.{16}/)
blocks.each do |block|
ret = ret + en_des_block(block, key)
end
ret
end
def de_des plain, key
ret = ''
blocks = plain.scan(/.{16}/)
blocks.each do |block|
ret = ret + de_des_block(block, key)
end
ret
end
def en_des_block(plain, key)
arr = []
arr << key
key = arr.pack("H*")
arr = []
arr << plain
plain = arr.pack("H*")
data = RubyDES::Block.new(plain)
key = RubyDES::Block.new(key)
des = RubyDES::Ctx.new(data, key)
encrypted_data = des.encrypt
encrypted_data.string.unpack("H*")[0]
end
def de_des_block(cypher, key)
arr = []
arr << key
key = arr.pack("H*")
arr = []
arr << cypher
cypher = arr.pack("H*")
data = RubyDES::Block.new(cypher)
key = RubyDES::Block.new(key)
des = RubyDES::Ctx.new(data, key)
plain = des.decrypt
plain.string.unpack("H*")[0]
end
def fill_plain plain
bytes = plain.length / 2
if bytes % 8 == 14
return plain + '80'
end
if bytes % 8 != 0
return plain + "80" + "00" * (7 - bytes % 8)
end
return plain
end
def enc plain, key
plain = fill_plain plain
key_left = key[0..15]
key_right = key[16..31]
a = en_des plain, key_left
b =de_des a, key_right
c = en_des b, key_left
end
def dec cypher, key
key_left = key[0..15]
key_right = key[16..31]
a = de_des cypher, key_left
b =en_des a, key_right
c = de_des b, key_left
end
def test
# plain: 5F3D3D33303D3D33323439343432343041444438363330413333303042363836354637333335370A3D3D33313D3D41464535334342344237434138333341423834414231383843464145464238330A3D3D33323D3D34443145433842413733383138304337423043453745314135454437454336300A3D3D0A62F788978ABB96
# key: D314F4AB5A9D237E1D1BCDD099DEB5B2
# cypher : BAFDDC45AEE2DEDF592C7C58246D03D4C5475D8D54B35291BA4BEA62F0D1877A2C222359E2DEC1F7018C0A0BD749C1162241C22A777DD4D3EA0B57268218B3B429716D01E00BEF6D54A7F83783631D1DEC514F26B9422C6C42A6D5D47245C98D82C2FFD7AB4CEEFCED139970D0C0D1315CD3CF288293F8A064F18E578D1375016904071100B21A5DAE4E5D1F5A13210A173B3D72D026AEBF34C8069B6A18EB01F73596C82549AEF502C3F9DA13A63FF38F49028A10624FFF2305CB618ADCD37BD7A2B046CC44B80E730BF09739474A0FED254ADB3225A5C93371103EDFF306605563EDA4122119F88A3F404E5B8AD0FD6AD95CE932F3FBB597EB24614380F066F3939FB53E4CA1A6048A7AA07E9ABB3C19DCF96762CCA85C77DB4069F9AB3A546224BF26F15B65DF5D7A72B67067BB1072AD7EE1524B490FED1930EA2050DC1A9DDB0DB3C77AAA367FBA94020A8CA20E534030243FD6F2D5D9BA9A6AC881A5B6
#p TDES.fill_plain "11223344556677880011"
p TDES.enc "5f3d3d33303d3d33323439343432343041444438363330413333303042363836354637333335370a3d3d33313d3d41464535334342344237434138333341423834414231383843464145464238330a3d3d33323d3d34443145433842413733383138304337423043453745314135454437454336300a3d3d34303d3d30453633463545413337453443454643433932304134334138304335303043360a3d3d35303d3d37363939413539453043364534314339303843324132464541304337433346370a3d3d35313d3d45354138433842384139304333453534424538413031343336354633413444350a3d3d36303d3d34383930334531303039324331373334333037423742353936453642463143350a3d3d36313d3d35334632343742354346413842414439354543453144453037383646463233420a3d3d36323d3d30314541363136303539454438323337353531363945463136374439414637300a", "D314F4AB5A9D237E1D1BCDD099DEB5B2"
p TDES.dec "BAFDDC45AEE2DEDF592C7C58246D03D4C5475D8D54B35291BA4BEA62F0D1877A2C222359E2DEC1F7018C0A0BD749C1162241C22A777DD4D3EA0B57268218B3B429716D01E00BEF6D54A7F83783631D1DEC514F26B9422C6C42A6D5D47245C98D82C2FFD7AB4CEEFCED139970D0C0D1315CD3CF288293F8A064F18E578D1375016904071100B21A5DAE4E5D1F5A13210A173B3D72D026AEBF34C8069B6A18EB01F73596C82549AEF502C3F9DA13A63FF38F49028A10624FFF2305CB618ADCD37BD7A2B046CC44B80E730BF09739474A0FED254ADB3225A5C93371103EDFF306605563EDA4122119F88A3F404E5B8AD0FD6AD95CE932F3FBB597EB24614380F066F3939FB53E4CA1A6048A7AA07E9ABB3C19DCF96762CCA85C77DB4069F9AB3A546224BF26F15B65DF5D7A72B67067BB1072AD7EE1524B490FED1930EA2050DC1A9DDB0DB3C77AAA367FBA94020A8CA20E534030243FD6F2D5D9BA9A6AC881A5B6", "D314F4AB5A9D237E1D1BCDD099DEB5B2"
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment