位置: 编程技术 - 正文

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

  • 商贸流通企业出口退税的会计处理怎么做
  • 员工年终奖个税规避
  • 商业写字楼
  • 营业账簿印花税申报期限
  • 贴现法付息的有效年利率
  • 为什么对子公司长投要用成本法
  • 企业股权融资方式有
  • 财政拨款的事业单位有哪些
  • 企业厂房整改应该计入什么科目?
  • 企业给员工购买社保的规定
  • 公司购买东西怎么做分录
  • 其他业务活动包括
  • 税负率是税率吗
  • 外汇风险管理的贸易融资法
  • 增值税专票需要哪些开票信息
  • 国企不交社保怎么办
  • 盐酸编号
  • 只要有收入就要交印花税吗
  • 旅游业务开什么发票
  • 广告支持政策
  • 增值税和增值税额的区别
  • 拿提成的工资怎么算
  • 代征税款手续费规定
  • 环评费属于固定资产吗
  • 实物福利计入工资总额
  • 石油天然气用途
  • 什么是工商企业为了筹集资金而发行的债券
  • win10系统中怎么共享文件
  • 预缴企业所得税怎么做账务处理
  • linux系统用法
  • 财务费用明细科目有哪些
  • 其他债权投资按公允价值计量,为什么计提减值准备知乎
  • 非货币性资产交换是企业经常发生的
  • 企业低值易耗品有哪些
  • 亏损企业所得税汇算清缴怎么做
  • 可以享受企业所得税加计扣除的有
  • php提示框
  • 利润表的营业收入是开票金额吗
  • 给员工报销
  • 计提工会经费明细表
  • 金蝶k3开票
  • 用友t3怎样设置权限
  • 销售货物应税劳务清单怎么填
  • 计提坏账准备和确认坏账损失
  • 公司注销了就可以不发工资么
  • 股东转让股权公司需要审查
  • 科技项目专项资金
  • 怎么才能获得音乐
  • 出口退税一般程度是什么
  • 车辆etc设备
  • 小规模纳税人购买税控设备
  • 土地使用权属于无形资产吗
  • 免税苗木普通发票抵扣怎么在申报填写
  • 应付账款借方余额在资产负债表中怎么列示
  • 转账支票办理收款所要拿的单证
  • 公司基本户可以变更吗
  • 应付账款不需要付情况说明
  • 职工福利费如何计算
  • 销项税小于进项税是亏本吗
  • 支票有效期过期了怎么办
  • 代扣代缴的增值税为什么可以抵扣
  • SQLserver中cube:多维数据集实例详解
  • sqlserver控制器名称
  • b-树和b+树都能有效地支持随机检索
  • 无法ping通虚拟机
  • mac双系统删除mac系统
  • windows10自带磁盘修复工具
  • 介绍两个很常用的成语
  • win10输入框在哪里
  • pavsrv50.exe - pavsrv50进程管理信息
  • w10自启
  • 红石id
  • 列举linux常用的几个命令
  • unity3d物体移动代码
  • 用python写多线性模型
  • jquery 滑块
  • javascript 日期
  • 哈尔滨国税局待遇怎么样
  • 如何在国税网下载发票
  • 生育登记网上服务大厅山东
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设