位置: 编程技术 - 正文

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

  • 房产税税源信息采集错误已到申报期怎么办
  • 借款合同印花税减免优惠政策2023
  • 以前年度损益调整在利润表中怎么填
  • 买电脑所有配件
  • 增值税发票税控开票软件怎么下载
  • 端午节福利计入什么科目
  • 上年度职工月平均工资是税前还是税后
  • 公司员工的伙食费计入什么科目
  • 企业贷款核销条件
  • 税前扣除的职工福利费标准
  • 农产品加计扣除政策2023最新
  • 股东取得利息收入如何纳税
  • 个人转租工厂需交什么税
  • 个人怎么开增值税
  • 国税2017年16号文
  • 印花税的滞纳金怎么计算
  • 提前收取租赁收入的财务处理
  • 企业发生的运输费用怎么做账?
  • 专利年费是不是只能一项一项交
  • 资本公积转增股本会计处理
  • 预收账款可以开票吗
  • 年度报表申报错误,怎样更正
  • 地下人防设置要求
  • getparameter报错
  • windows预览体验计划选哪个渠道
  • 如何查看电脑是什么牌子
  • 两免三减半条件
  • 销售安装费的账务处理
  • 常见的财务报表分析方法有多选题
  • PHP:imagegrabscreen()的用法_GD库图像处理函数
  • 一次补发工资怎么算
  • 公司可以不再提取法定公积金
  • Vue Router4 ,prams 传参失效和报错问题
  • 增值税返还需要交增值税吗
  • 购买金税盘的费用会计分录
  • 年金现值系数和年金终值系数的公式
  • 股东借款转增资本公积要验资吗
  • 企业没有ca怎么登陆公积金账户
  • js在数组中查找指定元素
  • 企业员工福利包括哪些内容
  • 机关党建经费提取比例
  • 收外汇是一定要交税吗
  • 个人所得税减免项目有哪些
  • 现金流量表里支付的各项税费包括什么
  • 取得股息红利所得 个人所得税
  • 委托银行贷款利息发票谁提供
  • 事业单位小规模纳税人增值税账务处理
  • 合并报表问题
  • 当月开的发票次月预缴税款行得通吗?
  • 实物出资没有发票怎么办
  • 担保公司的担保费能退吗
  • 投资别人的公司叫什么
  • 小规模纳税人手工帐怎么做
  • 平均增长率计算公式怎么算
  • 社区养老服务平台
  • mysql数据库内存占用高
  • sqlserver数据库迁移至mysql
  • shell 加密密码
  • centos7内存占用大
  • mac安装windows10体验
  • 电脑开机黑屏光标闪烁怎么解决
  • w10开发者模式
  • win7系统设置只让安装有证书的软件
  • 如何在windows上打开蓝牙
  • win8自带截图
  • win10 win+l
  • cocos环境搭建
  • 下列有关javascript中call和apply
  • ExtJS GridPanel 根据条件改变字体颜色
  • Windows环境下搭建Python开发环境的方法
  • 搭建nodejs
  • python3.5 + PyQt5 +Eric6 实现的一个计算器代码
  • 解决问题
  • node.js开发实战
  • nodejs教学视频
  • javascript教程完整版
  • jQuery插件封装时如要实现链式编程,需要
  • 税务局发涵有几种
  • 税的几个点是什么意思
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设