Java 在不同语言/平台中使用Openssl的方法

Java 在不同语言/平台中使用Openssl的方法,java,c,openssl,cryptography,Java,C,Openssl,Cryptography,众所周知,Openssl是加密领域的标准。Openssl是用纯C编写的,所以问题在于如何在不同的语言中使用Opnessl?这样的Java。尽管Java提供了JCE和BouncyCastle,但很难知道它们是否存在实现偏差,即对于相同的输入(合法或无效),JCE和Openssl输出不同的结果 到目前为止,我想到的是直接调用openssl命令。在实际产品中,如何解决这个问题 非常感谢您的帮助。OpenSSL使用标准化算法,这意味着无论您使用哪个库,相同密钥和算法的解密结果都是相同的 例如: 如果您使

众所周知,Openssl是加密领域的标准。Openssl是用纯C编写的,所以问题在于如何在不同的语言中使用Opnessl?这样的Java。尽管Java提供了
JCE
BouncyCastle
,但很难知道它们是否存在实现偏差,即对于相同的输入(合法或无效),JCE和Openssl输出不同的结果

到目前为止,我想到的是直接调用openssl命令。在实际产品中,如何解决这个问题


非常感谢您的帮助。

OpenSSL使用标准化算法,这意味着无论您使用哪个库,相同密钥和算法的解密结果都是相同的

例如:
如果您使用密钥为“I am a BlowFish”的BlowFish加密算法,并使用OpenSSL对其进行加密,那么您可以使用任何想要解密的库并获得相同的结果

话虽如此,在任何语言或操作系统中都可以使用OpenSSL库(通常是libcrypto和libssl)。但它确实需要一些管道。
在您的示例中,您可以使用JNI直接访问OpenSSL库函数。
这种方法要求您确保为目标体系结构和操作系统提供正确的库

就个人而言我会检查为什么会有偏差,因为这是您的主要问题。

如何在不同的语言中使用Opnessl?这样的Java

  • 在Java中使用JNI。它可以非常快。请注意JNI的“固定”概念——本机方法接收指向元素的直接指针——而不进行复制——但这有一些含义。固定是可选的。要使用JNI,通常应该创建包装器函数来调用目标函数(本例中为OpenSSL)。所以您应该根据JNI规则(参数类型jint等)创建共享库(DLL或其他),并调用OpenSSL函数

  • <> >依赖于语言——一般来说,在托管语言中,你应该把C代码包(例如COM或托管C++中使用.NET)。在C++中直接实现。C#还具有调用C函数的机制


使用,而不是命令行工具。例如,即使对于Base64这样的简单算法,PC中的JVM行为也与Android不同。(有人在Stackoverflow中发布了此问题)。我希望客户端和服务器都使用相同的加密库,以避免潜在的“偏差”。然后尽可能使用相同的库。只需确保为您的体系结构使用正确的lib即可。你知道如何使用jni吗?,。谢谢,我将尝试openssl的JNI绑定。希望JNI不会太复杂。您可以提供链接,指向您在加密库中看到不同行为的地方吗?谢谢您的回答。JNI能够执行C代码,但我不确定是否必须修改openssl的源代码。我更喜欢找到一种在Java中执行openssl的“快速”方法;虽然执行shell很快,但我无法控制异常。更新-您不应该更改OpenSSL代码-创建包装器。这并不难。