CJV_1——ImageViewer via swing

package ImageViewer;

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;

import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;

public class ImageViewer {

	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable(){

			@Override
			public void run() {
				JFrame frame = new ImageViewerFrame();
				frame.setTitle("ImageViewer");
				frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				frame.setVisible(true);
				
			}
			
		});

	}

}
class ImageViewerFrame extends JFrame{
	/**
	 * 
	 */
	private static final long serialVersionUID = -4785279480839401296L;
	private JLabel label;
	private JFileChooser chooser;
	private static final int default_width = 300;
	private static final int default_height = 400;
	public ImageViewerFrame(){
		this.setSize(default_width, default_height);
		
		label = new JLabel();
		this.add(label);
		
		chooser = new JFileChooser();
		chooser.setCurrentDirectory(new File("."));
		
		JMenuBar menuBar = new JMenuBar();
		this.setJMenuBar(menuBar);
		
		JMenu menu = new JMenu("File");
		menuBar.add(menu);
		
		JMenuItem openItem = new JMenuItem("Open");
		menu.add(openItem);
		
		openItem.addActionListener(new ActionListener(){

			@Override
			public void actionPerformed(ActionEvent event) {
				int result = chooser.showOpenDialog(null);
				
				if(result == JFileChooser.APPROVE_OPTION){
					String name = chooser.getSelectedFile().getPath();
					label.setIcon(new ImageIcon(name));
				}
				
			}
			
		});
		
		JMenuItem exitItem = new JMenuItem("Exit");
		menu.add(exitItem);
		exitItem.addActionListener(new ActionListener(){

			@Override
			public void actionPerformed(ActionEvent event) {
				System.exit(0);
				
			}
			
		});
	}
	
}
此段代码在书中39页,倘若我个人没有之前的入门经历,看这大段还是蛮被打击的。
在使用 JMeter 进行验签的过程中,需要进行以下步骤: 1. 获取需要验签的数据和签名数据; 2. 对需要验签的数据进行摘要计算; 3. 使用公钥对签名数据进行解密; 4. 比较解密后的签名数据和摘要计算得到的数据是否一致。 具体实现可以参考以下代码: ``` import java.security.*; import java.security.spec.InvalidKeySpecException; import java.security.spec.X509EncodedKeySpec; import java.util.Base64; import javax.crypto.Cipher; import org.apache.commons.codec.binary.Hex; public class VerifySignature { public static void main(String[] args) throws Exception { // 获取需要验签的数据和签名数据 String data = "hello world"; String signature = "eHh4eHh4eHh4eHh4eHh4eA=="; // 获取公钥 String publicKeyStr = "MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAw7f7LgxJ3NzXJv6Lp1bT" + "PzCzLQkDxM7E9fQpGZvJY9v/FdR+3yBqW1zBfGdG2ZJQc8Dn8JnXg4Fb9j1hV/e" + "0ZMn6+G4T1Eew9pVQF0Ql8/mBz6v2vt4v9wAaY9Sj3yBui6TigE9M9aBZoVYv+F" + "3N8W1XU6jT2pRf+Oz6ZrLxQP7Q4v9L5w5v7rL8i6CJv9EQjZbDZ7NQbpH8Sf5Pq" + "A1DgXwCzD1Zq+fJ5mSv+Qd4nQHJ8fzLx3JbQVdNh3lXNNY+uN4+JZvD7qJ2t6GJ" + "We8FzP+CcTQq7nSndV0PdJNmcn1t6/V6yfOoRyjK/4W8Xwu2Em3IcPcJ1Jr+gqB" + "3PmLkMfYzYF7LX3W3dZsQ1Q/X1m+0GFc7UqSzmwU2YRGR6vU5jS1xJWpVv8q1X2" + "sNQhM6EoV1s+G7Ff9v5Wkd1YiFp1NjgJl9yWJWdAaSgJecyY2xV+B8uS5Jhjpe8" + "vLlZ9P1XZ5+JZmGyZXtDrRwzvCfWg3zkWj7Q2/5f3h9zvK1LDeUChJhP0eYjGxs" + "0pJFbCEl7qXm9Qm5jLg4N9oZzCfN7Y1bW3z2vOeEER3xk8tWugmD3nKg2H9XKJC" + "8cM0U3Tgm0LWLhV7VXq3bZVw4Tf2l7aLJwu3z9iQikb6rTmK9Rd6rzt0d1GE0C8" + "k6B0uN6UvN5A7dYLyfy9+L0CAwEAAQ=="; PublicKey publicKey = getPublicKey(publicKeyStr); // 对需要验签的数据进行摘要计算 String digest = calculateDigest(data); // 使用公钥对签名数据进行解密 byte[] signatureBytes = Base64.getDecoder().decode(signature); byte[] decryptedSignature = decrypt(signatureBytes, publicKey); // 比较解密后的签名数据和摘要计算得到的数据是否一致 boolean verified = Hex.encodeHexString(decryptedSignature).equals(digest); System.out.println("验签结果:" + verified); } private static PublicKey getPublicKey(String publicKeyStr) throws NoSuchAlgorithmException, InvalidKeySpecException { byte[] publicKeyBytes = Base64.getDecoder().decode(publicKeyStr); X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKeyBytes); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); return keyFactory.generatePublic(keySpec); } private static String calculateDigest(String data) throws NoSuchAlgorithmException { MessageDigest md = MessageDigest.getInstance("SHA-256"); byte[] digestBytes = md.digest(data.getBytes()); return Hex.encodeHexString(digestBytes); } private static byte[] decrypt(byte[] encryptedData, PublicKey publicKey) throws Exception { Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); cipher.init(Cipher.DECRYPT_MODE, publicKey); return cipher.doFinal(encryptedData); } } ``` 其中,`getPublicKey` 方法用于将公钥字符串转化为 `PublicKey` 对象;`calculateDigest` 方法用于计算数据的摘要值;`decrypt` 方法用于使用公钥解密签名数据;最后在 `main` 方法中进行以上步骤的调用并比较解密后的签名数据和摘要计算得到的数据是否一致。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值