位置: 编程技术 - 正文

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(网格布局)

  • 个体工商户是否跨省经营
  • 进口关税怎么做分录
  • 年金的扣费标准
  • 出口货物的报关时限为装货的24小时以前
  • 从价定率的计算公式
  • 取用备用金要188分
  • 存款利息收入需要缴纳所得税吗
  • 发票红冲重新开
  • 混凝土委托加工税率
  • 小规模企业没有进项发票怎么办
  • 劳务分包服务费率
  • 企业年金税前扣除标准表
  • 企业购车票可以抵扣增值税吗?
  • 小规模纳税人进项税额怎么处理
  • 资本公积与股东借款
  • 未达到起征点销售额会计分录
  • 上个月开的发票退回怎么处理?
  • 报关单上的运费怎么看
  • 建安行业简易计税可以抵扣吗
  • 增值税发票已认证抵扣还可以进项税额转出吗
  • 预测“叫停GPT-4后续AI大模型”后续:这是一个囚徒困境
  • php详细安装步骤
  • pytorch f
  • 企业的留存收益可以抵税吗
  • php foreach循环遍历数组
  • 跨省不动产登记
  • 分包工程的账务处理
  • 增值税加计抵减申报表怎么填
  • 以我为主题画一幅画
  • 失控发票成本转出怎么做账
  • 关于简单的绘画
  • php购物车及订单思路
  • 帝国cms功能
  • 本期应补退税额和期末未缴税额
  • 固定资产的认定标准2000元
  • 开启php
  • python多态的概念
  • 企业发生的汇兑差额
  • 无偿受让股权是利好吗
  • 公司从一个帐户里扣税吗
  • 企业所得税年度纳税申报表A类怎么填
  • 增值税预缴的计税依据
  • 货物运输发票的开票要求
  • 帐户结余
  • 加盟费摊销会计分录
  • 备用金账目处理
  • 咨询服务业成本比例
  • 研发支出费用化支出结转到哪个科目
  • 生产成本和主营业务收入的关系
  • 如何管理固定资产账户
  • mysql必知必会mobi
  • windows微软官方
  • nvidia发布了G6X
  • 比较常见的成语有哪些
  • win10怎么设置加快电脑速度
  • WIN10开启高性能模式
  • win10 1607更新失败
  • win8.1技巧
  • 在windows中用于显示正在运行的程序名称的栏称为
  • 使用windows防火墙禁止软件联网
  • xp启用telnet
  • linux操作系统b
  • 如何使桌面图标透明
  • linux page buffer cache深入理解
  • Tree、Unformat、Vsafe命令的区别与使用说明
  • perl脚本输出变量
  • python获取数据代码
  • android documents
  • 美国对中国纺织服装关税
  • 国家河北税务局官网
  • 单位没有缴纳个人医保
  • 海南省税务局长
  • 发票代码如何查询公司
  • 个人所得税完税证明图片
  • 大管家多少集
  • 福州台江区怎么去
  • 税务工作者发展现状
  • 关于船舶吨税的最新法律规范
  • 代理记账费用可以全额抵扣吗
  • 广东省国家税务总局稽查局局长
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设