位置: 编程技术 - 正文

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

  • 房地产企业怎么认定
  • 企业所得税成本调减怎么填
  • 合并资产负债表和合并利润表的区别
  • 总产值和主营业务收入
  • 结构性存款是
  • 预收货款增值税纳税义务发生时间如何确定
  • 高温费计税吗
  • 工程项目劳务分包合同范本
  • 小微企业营业外收入税率是多少
  • 附加税按实际缴纳计提吗
  • 公司成立初期费用入账
  • 销售机械设备的税率是多少
  • 上年的费用支出包括哪些
  • 分摊材料成本差异率怎么算
  • 生产成本的明细账怎么登记
  • 公司活动宣传稿怎么写
  • 发票请求流水号不能为空
  • 外出经营地预交税金归主管税务所管吗
  • 全资的子公司
  • win8系统怎么连接无线
  • 100%控股有什么风险
  • 以前年度亏损在哪个报表体现
  • php面包屑导航
  • 代理报关费会计怎么做账
  • php数组函数 菜鸟
  • php curl_init
  • 运输发票的抵扣税率
  • 汇总开具发票
  • 诉讼费属于什么费用
  • 小规模纳税人免税政策2023年
  • vue ref获取元素高度
  • vue 绑定子组件属性
  • pytorch怎么入门
  • jasypt加密解密
  • 圣诞节英文祝福语50字
  • 四舍五入的弊端
  • 企业转让时应收账款如何处理
  • 企业报废原材料如何处理
  • mongodb document
  • 红字专用发票能作废吗
  • 公司一般户需要年检吗
  • 办公室装修 会计分录
  • 其他所得
  • 固定资产一次性扣除政策
  • 以前年度损益调整怎么结转
  • 所得税税率变化对已确认递延所得税资产的影响
  • 季节性生产企业有哪些
  • 工会经费网上怎么申报
  • 购买原材料保险费分录
  • 以公允价值计量的金融资产
  • 存货有哪几个科目
  • 招待客人的住宿叫什么
  • 买车给了上牌费去车管所还用给钱吗
  • 用户画像
  • 笔记本如何一键锁屏快捷键
  • azipmd5.exe是什么
  • win8.1系统安装教程
  • windows10如何设置windows7开始菜单
  • uefi bios ufilify
  • win10系统无法打开设置
  • linux chakan
  • win8能装pr2017吗
  • nodejs的express框架详解
  • 疯狂Android讲义(kotlin版)
  • debug命令及其基本操作
  • perl linux命令
  • nodejs的理解
  • css ul显示为表格
  • android新手入门
  • node-js
  • js复制对象的方法有哪几种
  • 浅析jQuery Ajax请求参数和返回数据的处理
  • JavaScript For Beginners(转载)
  • 在androidstudio中,如何改变图片的位置
  • 成都市地方税务局 组织税收收入 2010
  • 税务局六大攻坚
  • 内蒙古税务局发票认证
  • 广州地税网上社保怎么交
  • 税务上的关联企业指哪些
  • 中俄改订条约收回哪里
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设