在 Ruby 中使用 DES ECB 加密数据
Encrypt data with DES ECB in Ruby
我正在另一个 java 项目中的一个项目中实施加密。
java项目中的代码是这样的:
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)));
}
在 Ruby 项目中我也想实现这个加密。但这不起作用:
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/, "")
在终端我收到这条消息:
'key' be must 8 bytes
我需要这个return:b42e3dbfffd4bb5487a27fd702f079e287e6325767bfdd20
查看:
http://des.online-domain-tools.com/link/1145159gOjlrPNRkaT/
这个错误对我来说似乎很清楚。您使用的密钥 chave
是 16 个字节。您的密钥必须是 8 个字节。所以将密钥的长度减少到 8 个字符然后尝试。
您还没有从十六进制字符串转换密钥和数据,您可以使用 pack
:
dado = ["53495A45303030386E6F7661313031305858585858585858"].pack('H*')
(当你对密钥执行此操作时,它会从 16 个十六进制字符转换为 8 个字节,因此不执行此步骤会导致错误正在获取)。
您没有指定无填充:
des.padding = 0
并且您想要十六进制编码的结果,而不是 base 64。您可以使用 unpack
:
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
。
我正在另一个 java 项目中的一个项目中实施加密。
java项目中的代码是这样的:
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)));
}
在 Ruby 项目中我也想实现这个加密。但这不起作用:
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/, "")
在终端我收到这条消息:
'key' be must 8 bytes
我需要这个return:b42e3dbfffd4bb5487a27fd702f079e287e6325767bfdd20
查看: http://des.online-domain-tools.com/link/1145159gOjlrPNRkaT/
这个错误对我来说似乎很清楚。您使用的密钥 chave
是 16 个字节。您的密钥必须是 8 个字节。所以将密钥的长度减少到 8 个字符然后尝试。
您还没有从十六进制字符串转换密钥和数据,您可以使用 pack
:
dado = ["53495A45303030386E6F7661313031305858585858585858"].pack('H*')
(当你对密钥执行此操作时,它会从 16 个十六进制字符转换为 8 个字节,因此不执行此步骤会导致错误正在获取)。
您没有指定无填充:
des.padding = 0
并且您想要十六进制编码的结果,而不是 base 64。您可以使用 unpack
:
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
。