【问题标题】:libgcrypt AES to return ascii ciphertext?libgcrypt AES返回ascii密文?
【发布时间】:2011-05-02 00:27:45
【问题描述】:

嘿,我正在开发一个 JNI 共享库,它使用 AES256 CFB 模式使用 libgcrypt 加密一些数据,然后将加密后的数据传回 java 应用程序进行进一步处理。

但是,当我尝试通过再次将数据传递给共享库来解密数据时,我无法再取回原始纯文本。似乎如果我加密和解密相同的数据而不将其传递回 Java 应用程序,我会得到原始的纯文本。

我在想是我用来存储加密数据的字符缓冲区转换为 NewStringUTF()(即 env->NewStringUTF(buf))发送回导致问题的 java是否可以将加密数据的输出/转换为 ascii,或者是否有其他解决方法?

非常感谢, 福

【问题讨论】:

    标签: java c++ cryptography java-native-interface gnupg


    【解决方案1】:

    您为什么使用 JNI 和外部库来加密字符串?使用 Java 内置的javax.crypto.Cipher 类。

    但是,关于您的实际问题,您应该将数据作为字节数组而不是字符串传递。密码对字节进行操作,而不是抽象的 Unicode 代码点。

    【讨论】:

    • 强制使用 libgcrypt,否则 JCE 会更容易:( libgcrypt 中的 encrypt 方法将加密数据传回 char const 缓冲区,所以我想我可以将其作为新的 utf 返回字符串。我会先给出字节数组,看看情况如何,干杯
    • @Foo,我会尝试推迟这项任务。这既愚蠢又浪费开发人员的时间,我怀疑它会带来什么好处。无论如何,请记住 C 中的 char 是一个字节,而不是 Unicode 字符; char* 的自然 Java 等效项是 byte[],而不是 String。将其转换为字符串是有问题的,因为字节序列不一定遵循 UTF-8 或 UTF-16 或任何其他 Unicode 编码的规则。
    • 你的钱在那里。我修改它以返回一个 jbytearray 而不是一个字符串,现在它工作正常。干杯:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-19
    • 2021-04-24
    相关资源
    最近更新 更多