使用Ruby中的DES ECB加密数据

时间:2018-03-09 15:22:12

标签: ruby encryption des

我正在另一个java项目中的项目中实现加密。

java项目中的代码是:

JQGridColumn jc = new JQGridColumn();
jc.DataFormatString = "{0:" + UserDateDisplayFormat + "}";

CustomFormatter jcformatter = new CustomFormatter();
jcformatter.FormatFunction = "FormatNullDateCellValue";
jc.Formatter.Add(jcformatter);

在Ruby项目中我也希望实现这个加密。但这不起作用:

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)));
}

在终端我回复了这条消息:

  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/, "") 

我需要这个回报: b42e3dbfffd4bb5487a27fd702f079e287e6325767bfdd20

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

2 个答案:

答案 0 :(得分:1)

您尚未从十六进制字符串转换键和数据,您可以使用Primefaces 6.1.1 release执行此操作:

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

(对密钥执行此操作时,它会从16个十六进制字符转换为8个字节,因此不执行此步骤会导致错误发生。)

您尚未指定无填充:

des.padding = 0

您希望结果为十六进制编码,而不是基数为64.您可以使用pack

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

全部放在一起:

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]

结果为b42e3dbfffd4bb5487a27fd702f079e287e6325767bfdd20

答案 1 :(得分:0)

这个错误对我来说非常清楚。您使用chave的密钥是16个字节。你的密钥必须是8个字节。因此,将密钥的长度减少到8个字符,然后尝试。