Search code examples
rubyencryptiondes

Encrypt data with DES ECB in Ruby


I am implementing an encryption in a project that I has in another java project.

The code in java project is this:

public static String cifraDES(String chave, String dado) throws Exception {
        DESKeySpec keySpec = new DESKeySpec(hexStringToByteArray(chave));
        SecretKeyFactory kf = SecretKeyFactory.getInstance("DES");
        SecretKey passwordKey = kf.generateSecret(keySpec);
        Cipher c = Cipher.getInstance("DES");
        c = Cipher.getInstance("DES/ECB/NoPadding");
        c.init(Cipher.ENCRYPT_MODE, passwordKey);
        return bytesToHex(c.doFinal(hexStringToByteArray(dado)));
}

In Ruby project i want implement this encrypt too. But this dont work:

  dado = "53495A45303030386E6F7661313031305858585858585858"
  chave = "3455189635541968"
  des = OpenSSL::Cipher.new('des-ecb').encrypt
  des.key = chave
  s = des.update(dado) + des.final

  Base64.encode64(s).gsub(/\n/, "") 

In terminal I recive this message:

'key' be must 8 bytes

And i need this return: b42e3dbfffd4bb5487a27fd702f079e287e6325767bfdd20

View: http://des.online-domain-tools.com/link/1145159gOjlrPNRkaT/


Solution

  • You haven’t converted the key and data from hex strings, you can do that using pack:

    dado = ["53495A45303030386E6F7661313031305858585858585858"].pack('H*')
    

    (When you do this to the key, it is converted from 16 hexidecimal characters to 8 bytes, so not doing this step is causing the error are getting).

    You haven’t specified no padding:

    des.padding = 0
    

    And you want the result hex encoded, not base 64. You can use unpack:

    puts s.unpack('H*')[0]
    

    Putting it all together:

    dado = ["53495A45303030386E6F7661313031305858585858585858"].pack('H*')
    chave = ["3455189635541968"].pack('H*')
    des = OpenSSL::Cipher.new('des-ecb').encrypt
    des.key = chave
    des.padding = 0
    s = des.update(dado) + des.final
    
    puts s.unpack('H*')[0]
    

    Result is b42e3dbfffd4bb5487a27fd702f079e287e6325767bfdd20.