-
-
Save sadasant/d086f21f9f6f39f10ab3 to your computer and use it in GitHub Desktop.
Ruby 3Des
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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