隐匿信息查询不经意传输协议的Java实现

您所在的位置:网站首页 java凑数算法 隐匿信息查询不经意传输协议的Java实现

隐匿信息查询不经意传输协议的Java实现

2023-04-15 12:10| 来源: 网络整理| 查看: 265

隐匿信息查询是隐私技术中一种常用的应用范式,而不经意传输(OT协议)是实现隐匿信息查询功能的原理。技术基础实际上是对RSA、AES等非对称/对称加密技术的组合运用。

系统流程 隐匿信息查询.png 代码

依赖

cn.hutool hutool-all 5.8.16

客户端:

package com.wangan; import cn.hutool.core.util.ArrayUtil; import cn.hutool.crypto.Mode; import cn.hutool.crypto.Padding; import cn.hutool.crypto.asymmetric.KeyType; import cn.hutool.crypto.digest.DigestAlgorithm; import cn.hutool.crypto.digest.Digester; import cn.hutool.crypto.symmetric.AES; import com.wangan.rsa.RSA; import java.io.UnsupportedEncodingException; import java.math.BigInteger; public class Client { private static int num = 6; //想查的编号 private static BigInteger aesKey = new BigInteger( "29552253920430244480935420141729228591524107699469182582408239360121179899450577101476579710345554967100561598716023732513996495299410141662749947786005937244656977738527833097623686415626468060988878281679146322528426363279034015388479917760840595285028058423329215856830057760069403267618402231064409756303753621261963998813245801555345709331865159424057596639080245793103551936729636763453083968195850372838520989535777891088951977529791342466901072485266582229616711047022114660121787354697672738075015287123936759958670135509278509350942132843134489493757755637523878155960314647723130468403810490573692371076668554081340711245013791760785972574183759777397663251563223522608282216156466237180692442271370955990451855629775212854995231450914759478136490035502825158538196415358501643051890005641780888343155829469962364157099845810220506084696098509487269528261738091603323397419416656531789855253870506832308483358363624293730162838161876883346182295801408785755959876699692983735536512143262257444692944221679236546240285743514676999000313320454652069198094628016190512249847885741233538694420190674827537926410498871218493798919040337011039226994754553313541467307192132768688698365695235674392298409676883545188918324372058782178620981923190334246098709749931778763297900223981313803899058107970787765589467633684966955996721171175415015860487524541409512786880456374877432683366318130671454224149144855682834737499745953873548378153316742130648196857516669493425502266531024732408366848110881647"); //随机大整数,也即AES密钥 public static void main(String[] args) { //1、启动服务端,生成10个密钥对 Server server = new Server(); Thread t = new Thread(server); t.start(); //2、用特定公钥去加密对称密钥 BigInteger[][] pks = server.getPks(); BigInteger[] pkt = pks[num-1]; //用4号公钥 System.out.println("2【客户端】选择" + num + "号女嘉宾,公钥:" + ArrayUtil.toString(pkt)); RSA rsa = new RSA(); BigInteger s_aesKey = rsa.encrypt(aesKey, pkt); System.out.println("2【客户端】aesKey是:" + aesKey + "," + num + "号公钥加密后的aesKey:" + s_aesKey); // (3、服务端会用所有的私钥去尝试解密客户端传来的加密的对称密钥; 4、服务端会用这10个对称密钥尝试去加密业务数据) String[] data_encrypt = new String[10]; try { data_encrypt = server.getDataCryptWithAes(s_aesKey); System.out.println("5【客户端】获得密文数组:" + ArrayUtil.toString(data_encrypt)); //5、从服务端取得10个加密数据,用对称密钥去解密,只有一个可以解密成功 Digester digester = new Digester(DigestAlgorithm.SHA256); byte[] sha256Key = digester.digest(aesKey.toByteArray()); AES aes = new AES(Mode.ECB, Padding.PKCS5Padding, sha256Key); String decryptData = aes.decryptStr(data_encrypt[num-1]); System.out.println("5【客户端】解密得到第"+ num + "号女嘉宾的身高是" + decryptData); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); }finally { server.countdown(); } } }

服务端:

package com.wangan; import cn.hutool.core.codec.Base64; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.RandomUtil; import cn.hutool.crypto.Mode; import cn.hutool.crypto.Padding; import cn.hutool.crypto.SecureUtil; import cn.hutool.crypto.asymmetric.KeyType; import cn.hutool.crypto.digest.DigestAlgorithm; import cn.hutool.crypto.digest.Digester; import cn.hutool.crypto.symmetric.AES; import com.wangan.rsa.RSA; import java.io.UnsupportedEncodingException; import java.math.BigInteger; import java.security.KeyPair; import java.security.SecureRandom; import java.util.concurrent.CountDownLatch; public class Server implements Runnable{ private CountDownLatch latch = new CountDownLatch(1); private int NUMS = 10; //一共多少个人 private BigInteger[][] pks = new BigInteger[10][]; //公钥 private BigInteger[][] sks = new BigInteger[10][]; //私钥 private String s_aesKey; //客户端传来的加密后的对称密钥 private static String[] data = {"168", "160","162","172","158", "164","159","167","161","160"}; //女嘉宾个人数据,身高 private static String[] data_encrypt = new String[10]; public Server(){ super(); //1、生成10个密钥对 genKeyPairs(); } /**根据客户端传来的加密后的aes密钥,用所有私钥解密、会得到10个aes密钥(只有1个真的),然后用解密后的aes密钥去加密对应的业务密文。 * 得到10份密文返回给客户端,客户端只能解密其中一份 * */ public String[] getDataCryptWithAes(BigInteger s_aesKey) throws UnsupportedEncodingException { //3、用所有的私钥去尝试解密客户端传来的加密的对称密钥 System.out.println("3【服务端】用所有的私钥去尝试解密客户端传来的加密的对称密钥"); BigInteger[] keys = new BigInteger[10]; for(int i=0; i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3