![](/img/trans.png)
[英]Encrypt and Decrypt with AES ECB mode 'BadPaddingException' in some cases
[英]AES ECB mode encrypt in java and decrypt in ruby
我必須使用Java編寫的加密方法。 我的加密Java代碼:
public static String encrypt(String content, String sKey) {
try {
SecretKey secretKey = null;
KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
secureRandom.setSeed(sKey.getBytes());
kgen.init(128, secureRandom);
secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] byteContent = content.getBytes("utf-8");
byte[] result = cipher.doFinal(byteContent);
return ByteUtil.parseByte2HexStr(result);
} catch (Exception e) {
e.printStackTrace();
}
return content;
}
## ByteUtil.java
...
public static String parseByte2HexStr(byte buf[]) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < buf.length; i++) {
String hex = Integer.toHexString(buf[i] & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
sb.append(hex.toUpperCase());
}
return sb.toString();
}
我的紅寶石解密代碼(不起作用):
require "openssl"
require 'digest/sha2'
require 'base64'
def decryption(encrypted, key)
decipher = OpenSSL::Cipher::AES.new(128, :ECB)
decipher.decrypt
decipher.padding = 0
decipher.key = [key].pack('H*')
encrypted = [encrypted].pack('H*')
plain = decipher.update(encrypted) + decipher.final
p plain
p plain.unpack('s*')
p plain.unpack('m*')
p plain.unpack('u*')
p plain.unpack('h*')
p plain.unpack('a*')
end
有人可以幫忙嗎? 提前致謝!!!
當我使用“ ef3192c8803a47cb829d487dd2f78a3d”作為密鑰,並用我的java代碼加密“ helloworld”時,我得到了“ 3CAEF382FB17A045EADDEFC72D3D0362”,但是當我嘗試使用紅寶石代碼對其進行解密時,我打電話
decryption('3CAEF382FB17A045EADDEFC72D3D0362', 'ef3192c8803a47cb829d487dd2f78a3d')
我不能讓“的HelloWorld”,所以我認為解密代碼是不工作的。
Java解密代碼(有效)
public static String decrypt(String content, String sKey) {
try {
SecretKey secretKey = null;
KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
secureRandom.setSeed(sKey.getBytes());
kgen.init(128, secureRandom);
secretKey = kgen.generateKey();
byte[] data = ByteUtil.parseHexStr2Byte(content);
byte[] enCodeFormat = secretKey.getEncoded();
SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] result = cipher.doFinal(data);
return new String(result, "UTF-8");
} catch (Exception e) {
e.printStackTrace();
}
return content;
}
Java實現有些混亂。
在Java代碼用於加密實際的AES密鑰是SecretKey secretKey
與使用下面的代碼生成的String sKey
作為輸入:
SecretKey secretKey = null;
KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
secureRandom.setSeed(sKey.getBytes());
kgen.init(128, secureRandom);
secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
為了能夠在紅寶石代碼中解密,您需要SecretKey secretKey
的內容。 嘗試在上面的代碼之后添加以下trace語句:
System.out.println("Key: " + ByteUtil.parseByte2HexStr(enCodeFormat));
並將其用作紅寶石通話中的密鑰。
您沒有在兩端使用相同的密鑰。 在Java加密,您使用的密鑰作為種子的隨機數生成器,然后使用該輸出作為重點。 在Ruby方面,您直接將輸入值用作鍵。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.