Реализация ID-шифрования в блоге не дает такой же результат - PullRequest
0 голосов
/ 23 мая 2011

Я наткнулся на этот пост в блоге, который описывает, как они шифруют свои идентификаторы.В образовательных и развлекательных целях я решил попробовать это.Я не могу понять, хотя.

Как описано в этом сообщении в блоге , я использую базу 36, кодирующую зашифрованное 64-битное значение 3DES, и получаю полученную строку в25 символов в длину.Как можно получить 13 символов, как утверждает сайт, без использования какого-либо потокового шифра - блог утверждает, что использует блочный шифр 3DES.

Вот код, который я использую:

require 'openssl'

SECRET_KEY = "secret"
ENCRYPTION_ALGO = "DES-EDE3-CBC"

def base36encode(s)
  s.unpack('H*')[0].to_i(16).to_s 36
end

def base36decode(s36)
  [s36.to_i(36).to_s(16)].pack 'H*'
end

def num_to_bits(n, bit_count=64)
  #Array.new(bit_count) { |i| (n)[i] }.reverse!
  sprintf('%064b', n).split("")
end

def bits_to_string(bits)
  [bits.join("")].pack("B*")
end

def num_to_binstring(n, bit_count=64)
  bits_to_string(num_to_bits(n, bit_count))
end

def binstring_to_num(str)
  #elements = str.unpack("N*")
  #(elements[0] << 32) | elements[1]
  #
  ans = 0
  str.each_byte do |i|
    ans = ans * 256 + i
  end

  ans
end

def encrypt(message, password)
  cipher = OpenSSL::Cipher::Cipher.new(ENCRYPTION_ALGO)
  cipher.encrypt
  cipher.pkcs5_keyivgen(password)
  ciphertext = cipher.update(message)
  ciphertext << cipher.final
end

def decrypt(message, password)
  cipher = OpenSSL::Cipher::Cipher.new(ENCRYPTION_ALGO)
  cipher.decrypt
  cipher.pkcs5_keyivgen(password)
  decryptedtext = cipher.update(message)
  decryptedtext << cipher.final
end

id = 12345678
puts "Encrypting: \"#{id}\""

num_string = num_to_binstring(id)
encrypted = encrypt(num_string, SECRET_KEY)
encoded = base36encode(encrypted).upcase
puts "Encrypted and encoded to: \"#{encoded}\" that's size is: #{encoded.length}\n"

decoded = base36decode(encoded.downcase)
decrypted = decrypt(decoded, SECRET_KEY)
string_num = binstring_to_num(decrypted)
puts "Decoded and decrypted to: \"#{string_num}\""

# ---- OUTPUT ---
# Encrypting: "12345678"
# Encrypted and encoded to: "49OMDVRHHMM24DVMODQU4X7JY" that's size is: 25
# Decoded and decrypted to: "12345678"

1 Ответ

1 голос
/ 25 мая 2011

Какого размера вывод шифрования перед кодированием base36?Я предполагаю, что ваш код шифруется в режиме CBC (учитывая, что ваш код упоминает pkcs5), и вы получаете IV и зашифрованный текст, всего 16 байтов.Из поста в блоге я делаю вывод, что автор использует режим ECB, что вы можете считать «необработанным» 3DES, что обычно неправильно для большинства ситуаций, но кажется здесь правдоподобным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...