亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何驗證由 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 關注
  • 452 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號