Шифрование JAVA AES ECB для миграции на Голанг - PullRequest
0 голосов
/ 11 июня 2018

Я пытаюсь перенести Java-реализацию расшифровки AES на Golang.Мне нужно расшифровать данные, которые ранее были зашифрованы с помощью кода JAVA с помощью Golang.Но пока мне не повезло, расшифровывая его.

Код 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);
}

Я пробовал реализации, такие как Криптография 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)

Ошибка не выдается, и возвращается строка.Но эта строка не находится близко к зашифрованным данным.Любая помощь очень ценится!Спасибо!

1 Ответ

0 голосов
/ 27 мая 2019

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)]
}
...