|
# frozen_string_literal: true |
|
|
|
require 'test/unit' |
|
require_relative 'des' |
|
|
|
class DESTest < Test::Unit::TestCase |
|
class << self |
|
def startup |
|
key_hex = '133457799BBCDFF1' |
|
@@key = |
|
key_hex |
|
.chars |
|
.map { |c| c.to_i(16) } |
|
.map { |b| b.to_s(2).rjust(4, '0') } |
|
.each_slice(2).to_a |
|
.map { |b2| b2.join.to_i(2) } |
|
.pack('C*') |
|
|
|
msg_hex = '0123456789ABCDEF' |
|
@@message = |
|
msg_hex |
|
.chars |
|
.map { |c| c.to_i(16) } |
|
.map { |b| b.to_s(2).rjust(4, '0') } |
|
.each_slice(2).to_a |
|
.map { |b2| b2.join.to_i(2) } |
|
.pack('C*') |
|
|
|
@@keys_for_assert = %w[ |
|
000110110000001011101111111111000111000001110010 |
|
011110011010111011011001110110111100100111100101 |
|
010101011111110010001010010000101100111110011001 |
|
011100101010110111010110110110110011010100011101 |
|
011111001110110000000111111010110101001110101000 |
|
011000111010010100111110010100000111101100101111 |
|
111011001000010010110111111101100001100010111100 |
|
111101111000101000111010110000010011101111111011 |
|
111000001101101111101011111011011110011110000001 |
|
101100011111001101000111101110100100011001001111 |
|
001000010101111111010011110111101101001110000110 |
|
011101010111000111110101100101000110011111101001 |
|
100101111100010111010001111110101011101001000001 |
|
010111110100001110110111111100101110011100111010 |
|
101111111001000110001101001111010011111100001010 |
|
110010110011110110001011000011100001011111110101 |
|
] |
|
end |
|
end |
|
|
|
def setup |
|
@des = DES.new |
|
end |
|
|
|
test 'All subkeys are valid' do |
|
@des.key = @@key |
|
@des.generate_keys |
|
@des.keys.each_with_index do |gen_key, i| |
|
assert_equal gen_key.join, @@keys_for_assert[i] |
|
end |
|
end |
|
|
|
test 'Applying IP to message will return valid binaries' do |
|
@des.message = @@message |
|
@des.binarize_message! |
|
|
|
assert_equal @des.permutate_with_ip.join, '1100110000000000110011001111111111110000101010101111000010101010' |
|
end |
|
|
|
test 'DES#separate_to_lr will return 1 Array includes 2 Arrays which is separated from IP permutated R' do |
|
@des.message = @@message |
|
@des.binarize_message! |
|
permutated_message = @des.permutate_with_ip |
|
l_set, r_set = @des.separate_to_lr(permutated_message) |
|
|
|
assert_equal l_set.join, '11001100000000001100110011111111' |
|
assert_equal r_set.join, '11110000101010101111000010101010' |
|
end |
|
|
|
test 'Applying E to R0 will return valid binaries' do |
|
@des.message = @@message |
|
@des.binarize_message! |
|
permutated_message = @des.permutate_with_ip |
|
_, r_set = @des.separate_to_lr(permutated_message) |
|
r0 = r_set.last |
|
|
|
assert_equal @des.permutate_with_e(r0).join, '011110100001010101010101011110100001010101010101' |
|
end |
|
|
|
test 'Operate K1 xor E(R0) will return valid binaries' do |
|
@des.key = @@key |
|
@des.generate_keys |
|
@des.message = @@message |
|
@des.binarize_message! |
|
|
|
permutated_message = @des.permutate_with_ip |
|
_, r_set = @des.separate_to_lr(permutated_message) |
|
r0 = r_set.last |
|
permutated_r = @des.permutate_with_e(r0) |
|
|
|
assert_equal @des.xor_with_key(permutated_r, 0).join, '011000010001011110111010100001100110010100100111' |
|
end |
|
|
|
test 'Operate S table to XORed statement will return valid binaries' do |
|
@des.key = @@key |
|
@des.generate_keys |
|
@des.message = @@message |
|
@des.binarize_message! |
|
|
|
permutated_message = @des.permutate_with_ip |
|
_, r_set = @des.separate_to_lr(permutated_message) |
|
r0 = r_set.last |
|
permutated_r = @des.permutate_with_e(r0) |
|
xored_r = @des.xor_with_key(permutated_r, 0) |
|
|
|
assert_equal @des.transpose_with_s_table(xored_r).join, '01011100100000101011010110010111' |
|
end |
|
|
|
test 'Applying P to S-operated R will return valid binaries' do |
|
@des.key = @@key |
|
@des.generate_keys |
|
@des.message = @@message |
|
@des.binarize_message! |
|
|
|
permutated_message = @des.permutate_with_ip |
|
_, r_set = @des.separate_to_lr(permutated_message) |
|
r0 = r_set.last |
|
permutated_r = @des.permutate_with_e(r0) |
|
xored_r = @des.xor_with_key(permutated_r, 0) |
|
transposed_r = @des.transpose_with_s_table(xored_r) |
|
|
|
assert_equal @des.permutate_with_p(transposed_r).join, '00100011010010101010100110111011' |
|
end |
|
|
|
test 'Assert L0 XOR F(R0, K1) is valid' do |
|
@des.key = @@key |
|
@des.generate_keys |
|
@des.message = @@message |
|
@des.binarize_message! |
|
|
|
permutated_message = @des.permutate_with_ip |
|
l_set, r_set = @des.separate_to_lr(permutated_message) |
|
r0 = r_set.last |
|
permutated_r = @des.permutate_with_e(r0) |
|
xored_r = @des.xor_with_key(permutated_r, 0) |
|
transposed_r = @des.transpose_with_s_table(xored_r) |
|
permutated_r = @des.permutate_with_p(transposed_r) |
|
l0 = l_set.last |
|
|
|
assert_equal @des.xor_with_l(permutated_r, l0).join, '11101111010010100110010101000100' |
|
end |
|
|
|
test 'Assert function chain will be working correctly' do |
|
@des.key = @@key |
|
@des.generate_keys |
|
@des.message = @@message |
|
@des.binarize_message! |
|
|
|
permutated_message = @des.permutate_with_ip |
|
l_set, r_set = @des.separate_to_lr(permutated_message) |
|
r0 = r_set.last |
|
|
|
result = @des.xor_with_l( |
|
@des.permutate_with_p( |
|
@des.transpose_with_s_table( |
|
@des.xor_with_key( |
|
@des.permutate_with_e(r0), 0))), l_set.last) |
|
|
|
assert_equal result.join, '11101111010010100110010101000100' |
|
end |
|
|
|
test 'Assert R16 L16 is valid binaries' do |
|
@des.key = @@key |
|
@des.message = @@message |
|
@des.generate_keys |
|
|
|
@des.binarize_message! |
|
|
|
permutated_message = @des.permutate_with_ip |
|
l_set, r_set = @des.separate_to_lr(permutated_message) |
|
16.times do |i| |
|
r = r_set.last |
|
result = @des.xor_with_l( |
|
@des.permutate_with_p( |
|
@des.transpose_with_s_table( |
|
@des.xor_with_key( |
|
@des.permutate_with_e(r), i))), l_set.last) |
|
l_set << r |
|
r_set << result |
|
end |
|
|
|
assert_equal l_set.last.join, '01000011010000100011001000110100' |
|
assert_equal r_set.last.join, '00001010010011001101100110010101' |
|
end |
|
|
|
test 'Assert encryption complate' do |
|
@des.key = @@key |
|
@des.message = @@message |
|
encrypted = @des.encrypt |
|
encrypted_bin = encrypted.bytes.map { |b| b.to_s(2).rjust(8, '0') }.join |
|
|
|
assert_equal encrypted_bin, '1000010111101000000100110101010000001111000010101011010000000101' |
|
end |
|
|
|
test 'Assert decryption complate' do |
|
@des.key = @@key |
|
@des.message = @@message |
|
|
|
enc_message = @des.encrypt |
|
@des.message = enc_message |
|
|
|
assert_equal @des.decrypt, @@message |
|
end |
|
end |