为了账号安全,请及时绑定邮箱和手机立即绑定

如何验证由 ECDSA [r, s] 值组成的 openssl 中的签名?

如何验证由 ECDSA [r, s] 值组成的 openssl 中的签名?

凤凰求蛊 2021-10-17 16:58:25
有很多方法可以做你想要的,所以这里只是其中之一:您需要为每个文本字段添加一个动作侦听器,并让它们设置一个公共变量(对文本字段的引用),以便您的代码知道最后选择哪个文本字段。然后,当您单击按钮时,您可以简单地使用该变量来了解选择了哪个文本字段并在末尾添加 1,或者执行您想做的任何其他操作,只需编辑事件即可。示例代码://Value to keep track of the last selected text fieldpublic static JTextField lastClicked;private static javax.swing.JButton jButton1;private static javax.swing.JTextField jTextField1;private static javax.swing.JTextField jTextField2;public static void main(String args[]){    //Create and display the form    java.awt.EventQueue.invokeLater(new Runnable()    {        public void run()        {            //Setup all the components            jButton1 = new javax.swing.JButton("Click Me");            jTextField1 = new javax.swing.JTextField("One");            jTextField2 = new javax.swing.JTextField("Two");            //Add listeners            jButton1.addActionListener(new java.awt.event.ActionListener()            {                public void actionPerformed(java.awt.event.ActionEvent evt)                {                    //Add a 1 to the last selected text field                    lastClicked.setText(lastClicked.getText() + "1");                }            });            jTextField1.addFocusListener(new java.awt.event.FocusAdapter()            {                public void focusGained(java.awt.event.FocusEvent evt)                {                    //change the selected text field to this one                    lastClicked = (JTextField) evt.getSource();                }            });            jTextField2.addFocusListener(new java.awt.event.FocusAdapter()            {                public void focusGained(java.awt.event.FocusEvent evt)                {                    //change the selected text field to this one                    lastClicked = (JTextField) evt.getSource();                }            });        }    });}请注意,在此示例中,我们将事件源强制转换为文本字段lastClicked = (JTextField) evt.getSource(),因此这仅适用于文本字段。如果要使用其他组件,则应使用整数或对象作为变量类型。
查看完整描述

1 回答

?
回首忆惘然

TA贡献1847条经验 获得超11个赞

OpenSSL 需要 X9.62 签名。这包括两个整数值 R 和 S 的 DER 编码。如果您查看提供程序类的 Bouncy Castle 源代码,SignatureSpi您会发现:


ASN1EncodableVector v = new ASN1EncodableVector();

v.add(new ASN1Integer(r));

v.add(new ASN1Integer(s));

byte[] derEncodedSignature = new DERSequence(v).getEncoded(ASN1Encoding.DER);

这是您应该使用 Bouncy Castle 对签名进行编码的内容。这里r和s应该是BigInteger你在两个元素结果数组中得到的值。


您可能已经猜到了,您也可以使用 Java JCASignature类来代替,这将产生相同的签名编码。如果需要或想要,您可以通过注册/指示提供者来使用 BouncyCastle 实现作为底层提供者。有趣的是,Bouncy Castle 库现在有一个非常快的 EC 实现,它击败了 Oracle 提供的实现,即使它是在本机代码中。


该二进制输出与用于OpenSSL的签名输入直接兼容。要创建文本字符串,可以将字节数组编码为 base 64 字符串(最好没有行结尾,例如Base64.encode(derEncodedsignature)),然后必须通过openssl enc  -base64 -A -d -in signature.txt -out signatureToVerify.bin


查看完整回答
反对 回复 2021-10-17
  • 1 回答
  • 0 关注
  • 331 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信