位置: 编程技术 - 正文

Android应用开发中如何使用RSA加密算法对数据进行校验(android应用开发基础)

编辑:rootadmin

推荐整理分享Android应用开发中如何使用RSA加密算法对数据进行校验(android应用开发基础),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:android应用开发心得体会,android应用开发实训总结,android应用开发实训报告,android应用开发实训总结,android应用开发期末考试题,android应用开发期末考试题编程题,android应用开发期末考试题,android应用开发心得体会,内容如对您有帮助,希望把文章链接给更多的朋友!

这个世界很精彩,这个世界很无奈。是的,在互联网时代,如何保护自己的数据,如何对数据进行加密和效验就变得非常的重要。这里总结一下Android平台使用Java语言,利用RSA算法对数据进行校验的经验。

先来看下如何RSA加密算法对数据进行校验的流程:

1、首先要用openssh之类的程序生成一个私钥

2、再根据私钥生成一个公钥

3、使用私钥和公钥,对数据进行签名,得到签名文件。

4、使用公钥和签名文件就可以对数据进行校验了。

再来看下如何实现:

1、生成位的私钥:

[html] view plaincopyopenssl genrsa -out private.pem

2、生成公钥

使用openssh也可以生成公钥,但是在使用的过程中,发现由于&#;式的问题,使用openssh生成的公钥在Java中使用时总是提示异常,所以最后还是根据网上的相关资料,使用Java语言来写了程序,使用的公钥可以在Java中使用,代码如下:

GenPublic.java

[java] view plaincopyimport java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintStream; import java.math.BigInteger; import java.security.KeyFactory; import java.security.KeyPair; import java.security.PublicKey; import java.security.Security; import java.security.Signature; import java.security.interfaces.DSAParams; import java.security.interfaces.DSAPublicKey; import java.security.interfaces.RSAPublicKey; import java.security.spec.XEncodedKeySpec; import java.security.spec.RSAPublicKeySpec; import javax.xml.bind.DatatypeConverter; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.openssl.PEMReader; import org.bouncycastle.util.encoders.Base; public class GenPublic { public static PrintStream out = System.out; public static PrintStream err = System.err; private static void genPublicKey(String privateFile,String pubFile) { try { PEMReader pemReader = new PEMReader(new FileReader(privateFile)); KeyPair pair = (KeyPair)pemReader.readObject(); PublicKey pubKey = pair.getPublic(); FileOutputStream outPub = new FileOutputStream(pubFile); byte[] bytes = pair.getPublic().getEncoded(); outPub.write(bytes); outPub.close(); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) throws Exception { if (args.length != 2) { err.println("Usage: java GenPublic <pem file> <public file>"); System.exit(1); } File pemFile = new File(args[0]); if(!pemFile.exists()) { err.println("PEM File Does Not Exist"); System.exit(1); } Security.addProvider(new BouncyCastleProvider()); genPublicKey(args[0],args[1]); } }

使用方法:

先编译:

[html] view plaincopyexport CLASSPATH=".:bcprov-jdk-.jar" javac GenPublic.java

再使用编译的程序生成公钥:

[html] view plaincopyjava GenPublic private.pem public.bin

用到的库可以在本文最后的链接中下载。

Android应用开发中如何使用RSA加密算法对数据进行校验(android应用开发基础)

再来看看生成签名文件的Java代码:

Sign.java

[java] view plaincopyimport java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.PrintStream; import java.security.KeyFactory; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.PublicKey; import java.security.SecureRandom; import java.security.Security; import java.security.Signature; import java.security.spec.XEncodedKeySpec; import javax.xml.bind.DatatypeConverter; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.jce.provider.JDKKeyPairGenerator; import org.bouncycastle.openssl.PEMReader; import org.bouncycastle.openssl.PEMWriter; class Sign { public static PrintStream out = System.out; public static PrintStream err = System.err; private static byte[] pubKeyData = null; public static void main(String[] args) throws Exception { if(args.length < 4) { err.println("Usage: java JavaSign <pem file> <public file> <data file to sign> <signed file>"); System.exit(1); } File pemFile = new File(args[0]); File pubFile = new File(args[1]); File dataFile = new File(args[2]); if(!dataFile.exists()) { err.println("Data File Does Not Exist"); System.exit(1); } Security.addProvider(new BouncyCastleProvider()); KeyPair keys = null; if(!pemFile.exists()) { err.println("PEM File Does Not Exist. Generating."); KeyPairGenerator r = KeyPairGenerator.getInstance("RSA"); //keysize in bits is r.initialize(,new SecureRandom()); keys = r.generateKeyPair(); PEMWriter pemWriter = new PEMWriter(new FileWriter(pemFile)); pemWriter.writeObject(keys); pemWriter.close(); //You must flush or close the file or else it will not save } else { keys = (KeyPair) new PEMReader(new FileReader(pemFile)).readObject(); } //read data file into signature instance FileInputStream fin = new FileInputStream(dataFile); byte[] data = new byte[(int) dataFile.length()]; fin.read(data); fin.close(); //Sign the data Signature sg = Signature.getInstance("SHA1withRSA"); sg.initSign(keys.getPrivate()); sg.update(data); //output base encoded binary signature byte signBytes[] = sg.sign(); fin = new FileInputStream(pubFile); pubKeyData = new byte[(int) pubFile.length()]; fin.read(pubKeyData); fin.close(); int len = pubKeyData.length; for (int i=0;i<data.length;i&#;&#;) { data[i] = (byte)(data[i] ^ pubKeyData[i%len]); } if (args.length == 4) { FileOutputStream out = new FileOutputStream(args[3]); out.write(signBytes); out.close(); } } }

同样先编译:

[html] view plaincopyexport CLASSPATH=".:bcprov-jdk-.jar" javac Sign.java

再看看看如何生成签名文件:

java JavaSign private.pem public.bin test.dat sign.bin

这里的test.dat即是要校验的数据,sign.bin为生成的签名文件:

最后,就是如何使用公钥和签名文件进行校验数据了:

来看下面的代码:

[java] view plaincopyimport java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.PrintStream; import java.security.KeyFactory; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.PublicKey; import java.security.SecureRandom; import java.security.Security; import java.security.Signature; import java.security.spec.XEncodedKeySpec; import javax.xml.bind.DatatypeConverter; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.jce.provider.JDKKeyPairGenerator; import org.bouncycastle.openssl.PEMReader; import org.bouncycastle.openssl.PEMWriter; class Verify { public static PrintStream out = System.out; public static PrintStream err = System.err; private static byte[] pubKeyData = null; public static void main(String[] args) throws Exception { if(args.length < 3) { err.println("Usage: java Verify <public file> <sign file> <data file to verify> "); System.exit(1); } File pubFile = new File(args[0]); FileInputStream fin = new FileInputStream(pubFile); pubKeyData = new byte[(int) pubFile.length()]; fin.read(pubKeyData); fin.close(); out.println("verifytData:"&#;verifyData(new File(args[1]),new File(args[2]))); } public static boolean verifyData(File signFile,File dataFile) { if(!signFile.exists()) { return false; } FileInputStream in = null; try { in = new FileInputStream(signFile); byte[] signatureBytes = new byte[(int)signFile.length()]; in.read(signatureBytes); in.close(); in = new FileInputStream(dataFile); byte[] data = new byte[(int)dataFile.length()]; in.read(data); in.close(); if (!verify(pubKeyData,signatureBytes,data)) { return false; } return true; } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { in.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return false; } public static boolean verify(byte[] pubKeyBytes,byte[] signatureBytes,byte[] dataBytes) throws Exception { XEncodedKeySpec pubKeySpec = new XEncodedKeySpec(pubKeyBytes); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); PublicKey pubKey = keyFactory.generatePublic(pubKeySpec); //load public key Signature sg = Signature.getInstance("SHA1withRSA"); sg.initVerify(pubKey); sg.update(dataBytes); //validate signature if(sg.verify(signatureBytes)){ return true; } return false; } }

使用方法:

java Verify public.bin sign.bin test.dat

在使用的过程中,签名文件一般是和数据打包在一起的,并且在校验的时候要保证公钥不会被篡改,要不然校验就没有意义了。

当然,这里对RSA的加密原理并没有讨论,这方面网上有很多相关的资料。

本文中用到的库可以从下面的链接中找到:

Android UI之GridLayout(网格布局) 说明:网格布局是4.0之后添加的布局,跟TableLayout有点像,但更加好用,它把容器分为一个rows*columns的网格,每个网格都是一个组件位,可是通过设置让

Android网络请求开源框架Volley快速使用指南(2)——异步获取图片 如果要学习volley基础的发起get和set请求的方法请参看:关于volley的发起get和set请求这篇主要提供一个快速使用volley加载网络图片到ImageView里的方法,具体

关于AS集成ndk的问题总结 最近要在AS里用到NDK,遇到不少错误,现在总结一下。这里不写具体怎么实现了,不知道的移步:

标签: android应用开发基础

本文链接地址:https://www.jiuchutong.com/biancheng/376643.html 转载请保留说明!

上一篇:生成APK的签名(apk签名生成器)

下一篇:Android UI之GridLayout(网格布局)

  • 半年奖个人所得税怎么算的
  • 农民专业合作社章程模板
  • 消费税是什么意思大白话
  • 认购股份有什么好处
  • 税法关于发票丢失的
  • 建设用地规划许可证和建设工程规划许可证的区别
  • 商业银行委托贷款期限
  • 外购产品对外捐赠的会计处理
  • 资本公积在现金流量表哪里体现
  • 冲抵货款的返利怎么做账
  • 不动产在建工程使用的外购货物
  • 新会计准则短期租赁会计分录
  • 差旅费住宿专票可以抵扣增值税吗
  • 开具增值税发票的注意事项有哪些?
  • 房产交易会涉及哪些费用
  • 收到退以前年度所得税
  • 固定资产出售时增值税怎么处理
  • 现金支票工本费发票
  • 不征税发票如何开具
  • 员工两处取得工资收入
  • 冲红发票开错了怎么办
  • 笔记本低电量提示
  • 如何在excel中添加多行空白
  • 劳保用品做账分录
  • 药品推广服务费怎么开票
  • php新手入门
  • 结转损益和结转成本
  • 营改增后不动产租赁费的税率是多少
  • 销售产品取得收入4500万元
  • php获取地理位置
  • php管理员和用户登录
  • 消耗品算什么科目
  • laravel创建model
  • 你知道怎么训练
  • 在php中,字符串有哪些表示形式
  • php array_fill
  • 以银行存款交纳欠缴税金
  • 注册公司行业分类有多少种
  • mysql用在哪些方面
  • mysql建表的完整步骤
  • 附有销售退回条件的商品销售
  • 施工企业的内部往来
  • 企业存货核算范围
  • 合同履约成本如何设置明细科目
  • 销售软件产品
  • 收到货款未开发票是否违法
  • 弃置费用预计负债的会计处理
  • 毛利差怎么计算公式
  • 退回投标保证金在投诉阶段怎么办
  • 企业薪资制度
  • 递延收益属于哪个报表项目
  • 对于事业单位无力支付的银行承兑汇票
  • 不能抵扣的进项税额转出会计分录
  • 一家公司一定要有一个社保吗
  • 手写发票还能用么
  • 管理会计运用什么软件
  • mysql 5.7.30安装
  • 双击盘符弹出属性
  • 帮我打开双击锁屏
  • win10系统如何关闭窗口特效
  • linux命令ls-l
  • mac m1读取ntfs
  • win8怎么系统重装系统
  • win7temp文件夹在哪
  • win8外接显示器没反应怎么办
  • [置顶]电影名字《收件人不详》
  • ftp下载怎么用
  • perl getoption
  • fastcgi iis
  • 不用javascript可以吗
  • UNITY gameobject代码中setacvtive(false)与面板中直接去掉勾 效果不一样
  • javascript面向对象编程指南第三版
  • delphi7教程
  • domcer下载
  • 小规模纳税人租金收入不超过30万
  • 扬州地方税务局在哪
  • 百旺数据恢复
  • 开红酒增值税票怎么开
  • 广州哪里有餐饮费发票
  • 代账好做吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设