JAVA AES ECB 加密到 Golang 的迁移

标签 java go encryption aes ecb

我尝试将 AES 解密的 Java 实现移植到 Golang。我需要使用 Golang 解密之前由 JAVA 代码加密的数据。但到目前为止我还没有解密它。

Java代码是:

private static byte[] pad(final String password) {
    String key;
    for (key = password; key.length() < 16; key = String.valueOf(key) + key) {}
    return key.substring(0, 16).getBytes();
}

public static String encrypt(String password, String message) throws Exception
{    
  SecretKeySpec skeySpec = new SecretKeySpec(pad(password), "AES");
  Cipher cipher = Cipher.getInstance("AES");
  cipher.init(1, skeySpec);

  byte[] encrypted = cipher.doFinal(message.getBytes());
  return Hex.encodeHexString(encrypted);
}

public static String decrypt(String password, String message)
throws Exception {

  SecretKeySpec skeySpec = new SecretKeySpec(pad(password), "AES");

  Cipher cipher = Cipher.getInstance("AES");
  cipher.init(1, skeySpec);

  cipher.init(2, skeySpec);
  byte[] original = cipher.doFinal(Hex.decodeHex(message.toCharArray()));
  return new String(original);
}

我尝试了类似 Cryptography GIST 的实现或

func decrypt(passphrase, data []byte) []byte {
  cipher, err := aes.NewCipher([]byte(passphrase))
  if err != nil {
    panic(err)
  }
  decrypted := make([]byte, len(data))
  size := 16

  for bs, be := 0, size; bs < len(data); bs, be = bs+size, be+size {
    cipher.Decrypt(decrypted[bs:be], data[bs:be])
  }

  return decrypted
}
hx, _ := hex.DecodeString(hexString)
res := decrypt([]byte(password), hx)

没有抛出错误,并返回一个字符串。但这个字符串与加密数据相差甚远。很感谢任何形式的帮助!谢谢!

最佳答案

Java 使用 PKCS5 算法默认添加填充。在您的 Go 代码中,您必须使用类似以下内容删除该填充(在返回解密值之前):

func pkcs5UnPadding(src []byte) []byte {
    length := len(src)
    if length%64 == 0 {
        return src
    }
    unpadding := int(src[length-1])
    return src[:(length - unpadding)]
}

关于JAVA AES ECB 加密到 Golang 的迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50796912/

相关文章:

java - Android SkImageDecoder::Factory 在解码图像时返回 null

go - go 例程运行时如何从 channel 读取

mongodb - 如何在mgo框架中使用mongodb 3.6的数组过滤器?

java - 写入我的 CipherStream 不会写入我的 ByteArrayOutputStream

java - 如何从 Java 中的 MIME 类型确定适当的文件扩展名

java - Wildfly 和 JAAS 登录模块

java - 为什么我的玩家会从平铺 map 中掉下来?

docker 安装 lvm 插件

php 编码字符串,反之亦然

java - BlowFish 解密 - nCFB 模式