【问题标题】:Encrypting a string in Java and decrypting it in C++. What i have to do more?在 Java 中加密字符串并在 C++ 中解密。我还需要做什么?
【发布时间】:2014-06-09 21:32:58
【问题描述】:

我需要在 Java 中加密一个字符串并在 C++ 中解密它。我见过 C++ 有 Crypto++ 库,Java 有 JCE。

对于c++,我参考这个页面

http://social.msdn.microsoft.com/Forums/ko-KR/bd1722e7-07b3-4119-b7de-10788f9f6e36/aes-string-encryption-in-c?forum=windowsmobiledev

结果不同。

在java中 abcd1234 7e77643ca7d46d46298be3239f1a5cdb abcd1234

在 C++ 中 奇怪的字符...

我要做什么?

【问题讨论】:

  • 嗯... a) 将密钥限制为 ASCII 是无稽之谈。 b) 可能的字符集差异。使用二进制数据。 c) C++ 部分的内存问题。瓦尔格林。 d) 如果您已经解决了所有问题,请尝试用两种语言加密相同的数据并比较输出。开始和/或结束时的不同字节? e) 一旦你知道如何提取真正的 AES 部分,你就可以想到解密。不是在那之前。

标签: java c++ encryption


【解决方案1】:

你的一个问题是你的“key”是从一个 String 派生的,它为 Java 和 C 提供了不同的结果:

Java:“abcdefgh12345678”.getBytes() 为您提供 UTF-8 (Linux) 或 ISO-8859-1 (Windows) 表示。无论如何,这些字符都被解释为 8 位字符,您将得到一个 16 字节长的数组。

C:您正在使用 WCHAR,它使用 AFAIK 16 位 unicode 字符。因此,您的密钥最终是 32 字节长。

结论:不同的key意味着不同的结果...

重要提示:请永远不要使用 ASCII 字符作为加密密钥!如果您想使用密码加密某些内容,请使用密码派生函数(如 PBKDF2)从密码生成密码。

出于测试目的,您可以在代码中静态定义字节/字符数组:

char myArray[] = { 0x00, 0x11, 0x22 }; // c
byte[] myArray = new byte[]{ 0x00, 0x11, 0x22 }; // Java

【讨论】:

  • 我不熟悉 aes_encrypt(..) 函数。因此,我无法在该主题上比较 C 和 Java 代码。
【解决方案2】:

显然java版本以十六进制显示为字符串格式,试试这个

for (int i = 0 ; i < 16 ; ++i)
std::cout << std::hex << static_cast<int>(buf[i]);
std::cout << std::endl;

编辑:返回 byteArrayToHex(加密);在您的 java 代码中对 bytearray 执行相同操作

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    • 1970-01-01
    • 2016-12-25
    • 2015-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多