java - 在 Android 中签名数据并在 python 中验证它

标签 java android python digital-signature

我已经编写了以下代码来在 android 中签名数据:

import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.spec.RSAPublicKeySpec;

import android.app.Activity;
import android.os.Bundle;

public class TestActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
            setContentView(R.layout.main);

        try{
        String m ="This is my message";
        System.out.println(m);

        KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
        keyPairGen.initialize(1024);
        KeyPair kp = keyPairGen.generateKeyPair();
        PrivateKey priKey = kp.getPrivate();
        PublicKey pubKey = kp.getPublic();


        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        RSAPublicKeySpec publicKeySpec = keyFactory.getKeySpec(pubKey, RSAPublicKeySpec.class);

        System.out.println("WITH toString: ");
        System.out.println("Mod :" + publicKeySpec.getModulus().toString());
        System.out.println("Exp :" + publicKeySpec.getPublicExponent().toString());
        System.out.println("PublicKey:" + pubKey.toString());




        System.out.println("PublicKey:" + pubKey);
        System.out.println("PublicKey Base64:" +MyBase64.encode(pubKey.getEncoded()));

        Signature instance = Signature.getInstance("SHA1withRSA");
        instance.initSign(priKey);
        instance.update(m.getBytes());
        byte[] signature = instance.sign();
        System.out.println("Signature: " + MyBase64.encode(signature));
        }catch(Exception e){
            e.printStackTrace();
        }

    }
}

我正在将 adb logcat 中的值复制粘贴到 python 中,我正在使用 python 验证它:

mod=#I paste mod here
exp=#I paste exp here
signature=#I paste signature here

message="This is my message"

publicKey = RSA.construct((mod,exp))
print 'PublicKey Base64: ' + publicKey.exportKey()
print str(publicKey)
test = SHA.new(message)
verifier = PKCS1_v1_5.new(publicKey)
signature_base = base64.b64decode(signature)
print "Verification: " + str(verifier.verify(test, signature_base))

我发现 MyBase64.encode(pubKey.getEncoded())(在 java 中)与 publicKey.exportKey()(在 python 中)相同

然而,验证结果总是错误的。

如果我使用 javac 运行 java 代码似乎工作正常。

任何帮助,可能出了什么问题?

最佳答案

通常这样的错误与额外的空格混入数据字符串有关。在计算哈希值之前尝试剥离它。

关于java - 在 Android 中签名数据并在 python 中验证它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11371120/

相关文章:

java - List 中的 get(int) 不能应用于 java.lang.String

java - 是否可以知道 JFrame 是否完全可见?

java - 创建一个对象,然后将其从在 Intent 中传回的数据添加到 ArrayList

python - 基于多列的运行计数

java - 无法解决 android studio 中的符号 'java.time.LocalDate' 错误

java - JAVA 中的 org.w3c.dom.Document

python - 在 argparse 中设置互斥集

Python实时键盘输入

java - 如何获取 APK 文件图标

android - 获取服务内 Activity 的结果