package PKI_System_Implement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;
public class TestPKI {
public static void main(String[] args) {
System.out.println("请您选择要进行的操作:\n1.获取公钥和证书"
+ "\n2.加密消息"
+ "\n3.签名消息"
+ "\n4.忘记密钥"
+ "\n5.撤销密钥");
Scanner scan = new Scanner(System.in);
System.out.println("请选择您要进行的操作:");
int choice = scan.nextInt();
switch(choice){
case 1: ObtainPK();break;
case 2: Encrypt();break;
case 3: SignCrypt();break;
case 4: RoadBackPK();break;
case 5: CancelPK();break;
default:System.out.println("您的选择有误!");;break;
}
}
//1.
public static User getUserFromConsole(){
User user = new User();
Scanner scan = new Scanner(System.in);
System.out.println("-----请您输入您的基本信息-----");
System.out.println("姓名:");
String userName = scan.nextLine();
System.out.println("密码(作为您的私钥,请您妥善保存):");
long password = scan.nextLong();
System.out.println("Email:");
String email = scan.next();
System.out.println("身份证ID:");
String ID = scan.next();
user.setUserName(userName);
user.setPassword(password);
user.setEmail(email);
user.setID(ID);
System.out.println(user);
return user;
}
//2.
public static void ObtainPK(){
System.out.println("-----------获取公钥和证书----------");
User user = getUserFromConsole();
RA.addUsers(user);
System.out.println();
System.out.println("注册用户成功!");
System.out.println("您的公钥为:" + user.getPk());
}
//3.
public static void Encrypt(){
/**
*用户的私钥为:sk=password
* 用户的公钥为:pk=(g, p, y)=(271,254699,y)
*/
System.out.println("-----------加密与解密----------");
System.out.println("----1.查询用户的公钥----");
Scanner scan = new Scanner(System.in);
System.out.println("请您选择查询方式:\n1.用户姓名"
+ "\n2.用户Email"
+ "\n3.用户身份ID");
String pk = null;
System.out.println("请选择您要进行的操作:");
int choice = scan.nextInt();
switch(choice){
case 1: pk = selectByName();break;
case 2: pk = selectByEmail();break;
case 3: pk = selectByID();break;
default: System.out.println("您的选择有误!");break;
}
System.out.println("您要查询的用户的公钥为:" + pk);
System.out.println("----2.加密消息----");
System.out.print("请输入一个消息m:");
long meg = scan.nextLong();
System.out.print("选择随机数k(小于p):");
long k=scan.nextLong();
System.out.println();
System.out.println("明文 m=" + meg);
long[] crypt = ElGamal.encrption(254699, 271, Long.parseLong(pk), k, meg);
System.out.println("密文 c1=" + crypt[0] + ", c2=" + crypt[1]);
System.out.println("----3.解密消息----");
System.out.println("用户接收到密文,用私钥进行解密:");
User user = new User();
System.out.println("请输入用户的私钥:");
long sk = scan.nextLong();
long message = ElGamal.decrption(254699, sk, k, crypt[0], crypt[1]);
System.out.println("解密后明文为:" + message);
}
public static String selectByName(){
String pk = null;
User user = new User();
System.out.println("请您输入要查询的用户姓名:");
Scanner scan = new Scanner(System.in);
String name = scan.nextLine();
String sql = "SELECT * FROM OpenPK WHERE userName=?";
ResultSet rs = JDBCTools.getPreResultSet(sql, name);
try {
if(rs.next()){
pk = rs.getString(4);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return pk;
}
public static String selectByEmail(){
String pk = null;
System.out.println("请您输入要查询的用户email:");
Scanner scan = new Scanner(System.in);
String em = scan.nextLine();
String sql = "SELECT * FROM OpenPK WHERE email=?";
ResultSet rs = JDBCTools.getPreResultSet(sql, em);
try {
if(rs.next()){
pk = rs.getString(4);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return pk;
}
public static String selectByID(){
String pk = null;
System.out.println("请您输入要查询的用户身份ID:");
Scanner scan = new Scanner(System.in);
String id = scan.nextLine();
String sql = "SELECT * FROM OpenPK WHERE ID=?";
ResultSet rs = JDBCTools.getPreResultSet(sql, id);
try {
if(rs.next()){
pk = rs.getString(4);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return pk;
}
//4.
public static void SignCrypt(){
System.out.println("-----------签名与验证----------");
Scanner scan = new Scanner(System.in);
System.out.println("请输入您的私钥:");
long sk = scan.nextLong();
System.out.println();
System.out.print("请输入一个消息m:");
long m = scan.nextLong();
System.out.print("选择随机数k(小于p):");
long k=scan.nextLong();
//签名
System.out.println();
System.out.println("明文 m="+m);
long[] sign = ElGamal.signature(254699, 271, sk, k, m);
System.out.println("消息m = " + m +",签名(r,s) = " + "(" + sign[0] + "," + sign[1] + ")");
//验证
long r = sign[0];
long s = sign[1];
System.out.println();
System.out.println("----1.查询用户的公钥----");
System.out.println("请您选择查询方式:\n1.用户姓名"
+ "\n2.用户Email"
+ "\n3.用户身份ID");
String pk = null;
System.out.println("请选择您要进行的操作:");
int choice = scan.nextInt();
switch(choice){
case 1: pk = selectByName();break;
case 2: pk = selectByEmail();break;
case 3: pk = selectByID();break;
default: System.out.println("您的选择有误!");break;
}
boolean verify = ElGamal.Verify(254699, Long.parseLong(pk), 271, m, r, s);
if(verify){
System.out.println("签名验证成功");
}else{
System.out.println("签名验证失败");
}
}
//5.
//这里是指用户忘记了自己需要保存的password私钥,
//需要借助公钥和自己的基本信息来找回password
public static void RoadBackPK(){
System.out.println("-----------密钥寻回----------");
Scanner scan = new Scanner(System.in);
System.out.println("请输入您的姓名:");
String name = scan.next();
System.out.println("请输入您的身份ID:");
String id = scan.next();
long password = 0;
//验证
String sql = "SELECT * FROM Users WHERE userName=?";
ResultSet rs = JDBCTools.getPreResultSet(sql, name);
try {
if(rs.next()){
if(id.equals(rs.getString(4))){
password = rs.getLong(2);
}
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("您的私钥为:" + password);
}
//6.
public static void CancelPK(){
System.out.println("-----------撤销密钥----------");
Scanner scan = new Scanner(System.in);
System.out.println("请输入您的姓名:");
String name = scan.next();
System.out.println("请输入您的私钥(password):");
long pword = scan.nextLong();
String sql = "SELECT * FROM Users WHERE userName=?";
String sql1 = "DELETE FROM Users WHERE userName=?";
String sql2 = "DELETE FROM OpenPK WHERE userName=?";
ResultSet rs = JDBCTools.getPreResultSet(sql, name);
try {
if(rs.next()){
if(pword == rs.getLong(2)){
Connection conn = (Connection) JDBCTools.getConnection();
PreparedStatement ps = (PreparedStatement) conn.prepareStatement(sql1);
ps.setString(1, name);
ps.executeUpdate();
}
}
CancelOpenPK(sql2, name);
System.out.println();
System.out.println("撤销密钥成功!");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void CancelOpenPK(String sql, String condition){
String sql2 = "DELETE FROM OpenPK WH
没有合适的资源?快使用搜索试试~ 我知道了~
基于elgamal实现PKI(java)
共24个文件
java:10个
class:10个
jar:1个
需积分: 10 10 下载量 190 浏览量
2015-10-02
10:15:46
上传
评论
收藏 759KB RAR 举报
温馨提示
基于Elgamal实现的PKI算法,实现了CA功能,利用CA进行发布密钥,并对密钥进行认证,可以进行加密。
资源推荐
资源详情
资源评论
收起资源包目录
PKI_System.rar (24个子文件)
PKI_System
.project 386B
src
PKI_System_Implement
User.java 1KB
Test.java 273B
CA.java 3KB
TestPKI.java 8KB
ElGamal.java 6KB
OpenPK.java 591B
optest.java 858B
RA.java 4KB
MD5.java 605B
JDBCTools.java 5KB
lib
mysql-connector-java-5.1.17-bin.jar 769KB
.settings
org.eclipse.jdt.core.prefs 598B
.classpath 457B
bin
PKI_System_Implement
User.class 2KB
ElGamal.class 5KB
JDBCTools.class 5KB
MD5.class 813B
optest.class 1KB
TestPKI.class 8KB
Test.class 397B
OpenPK.class 285B
RA.class 3KB
CA.class 3KB
共 24 条
- 1
资源评论
视界范儿
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功