我正在尝试编写代码来验证一些RSA签名.签名是使用OpenSSL命令行工具制作的,使用此命令行的等效命令:
openssl dgst -sha1 -sign private_key_file.pem < binary_data_file > sig
Run Code Online (Sandbox Code Playgroud)
我想用来libtomcrypt做验证:
以下是RSA验证函数的调用签名libtomcrypt:
int rsa_verify_hash_ex(
const unsigned char *sig, unsigned long siglen, // signature to verify
const unsigned char *hash, unsigned long hashlen, // hash value to check against sig
int padding, // defined constant value, see below
int hash_idx, // identifies which hash algorithm, see below
unsigned long saltlen, // specify salt length, see below
int *stat, // output parameter, returns whether verify succeeded or …Run Code Online (Sandbox Code Playgroud) 我正在使用SHA256和RSA使用OpenSSL在我的Ubuntu机器上签名.我的目标是使用Android的Java在Android上验证此消息.
以下命令在ubuntu上使用:
openssl genrsa -out private.pem 1024
openssl rsa -in private.pem -out public.pem -outform PEM -pubout
echo 'foobar' > data.txt
openssl dgst -sha256 < data.txt > hash
openssl rsautl -sign -inkey private.pem -keyform PEM -in hash > signature
openssl rsa -in private_key.pem -pubout -outform DER -out public_key.der
openssl enc -base64 -in signature -out base64_signature
Run Code Online (Sandbox Code Playgroud)
我现在已经创建了密钥,对消息进行了签名,为公钥创建了一个.der文件,该文件应该能够在Java中访问并使用Base64对消息进行编码.然后我将.der公钥放在我的设备上,并成功将密钥加载到PublicKey类中.
此方法用于验证消息:
public static boolean verify(PublicKey publicKey,String data,String verification){
java.security.Signature sig;
try {
sig = java.security.Signature.getInstance("SHA256WithRSA");
sig.initVerify(publicKey);
try {
sig.update(verification.getBytes());
} catch (Exception e) {
... …Run Code Online (Sandbox Code Playgroud) M2Crypto和OpenSSL CLI似乎没有创建相同的数字签名.这是我在Python中使用的代码:
import M2Crypto
rsa = M2Crypto.RSA.load_key("privkey.pem")
open("sig_m2crypto", "w").write(rsa.sign("md5-digest", "md5"))
Run Code Online (Sandbox Code Playgroud)
这是OpenSSL的命令行:
echo "md5-digest" | openssl rsautl -sign -inkey privkey.pem > sig_openssl
Run Code Online (Sandbox Code Playgroud)
在相同的输入,结果sig_m2crypto和sig_openssl总是不同的.重要的是我无法验证使用M2Crypto与OpenSSL生成的签名,反之亦然.
我的代码中是否有任何缺失使它们彼此不兼容?
附加信息:我在Windows 7下使用M2Crypto 0.21.1和OpenSSL 1.0.0.