当前位置: 首页 > news >正文

微网站栏目图标网址打不开是啥原因

微网站栏目图标,网址打不开是啥原因,珠海网站建设技术外包,阿q的项目wordpress********** 2017年3月15日留言 ——关于java卡Applet系列csdn博文 *************貌似有不少人在看我写的几篇关于java卡applet的博文#xff0c;也收到了一些评论指正博文错误#xff0c;或者私信叫我发代码文件过去。在此需要说明的是#xff0c;java卡applet的这几篇博文…**********   2017年3月15日留言 ——关于java卡Applet系列csdn博文 *************貌似有不少人在看我写的几篇关于java卡applet的博文也收到了一些评论指正博文错误或者私信叫我发代码文件过去。在此需要说明的是java卡applet的这几篇博文是自己在初学java卡applet的时候写的当时菜鸟一枚(虽然现在也还是菜鸟)未免会有些疏漏仅供参考希望大家在看的时候别太当权威如果博文中有错误也请谅解。另外关于叫我发代码的因为有些代码文件中的部分代码并非是我写的怕牵涉到版权问题所以就不能私发了不过我在博文放的我的那个github地址里面的代码可以去看看另外因为版权问题其实我后期对博文很多地方的代码做了删改所以现在看起来博文好像有些凌乱几个月前自己已经不做java卡applet这方面的开发了所以也就没再细心去修改好博文了java卡applet在行业内已经有好几年的历史了大家上网多找找其实能找到很多更好的学习材料当然有不少是全英的不过其实很多很好的材料就只有英文的所以多去翻翻前辈们的精华吧Bestwish********************** 新旧分割线  *****************************很多时候我们并不需要自己去实现一个较为复杂的算法而只需要知道怎么去调用现有的实现。API调用在C/C是用include函数的形式java其实也无非就是import类(方法、变量)的形式其他语言的也差不多例如web里面的前端框架所谓框架其实就是一堆别人已经写好的代码你拿去用然后继续在上面填充自己的代码说到底其实就是代码复用。而在java这里因为以.class文件的形式封装了实现我们看到的接口一堆.class文件里面方法的具体实现被隐藏了只能看到个函数原型所以调用javacardAPI的难度在于你得去看别人写的API注释(全英学好英语的作用有木有)去了解每个函数干什么的然后你才知道要实现自己的功能需要用到它的哪些函数以及调用顺序是怎样的一般在API(库)的目录下面都会有使用文档(html形式的)用eclipse直接翻.class文件的话会有一堆html标签符看着眼疼。话说不多上代码Des.java(调用DES算法API的主要文件)package helloWorld;import javacard.framework.JCSystem;import javacard.security.DESKey;import javacard.security.Key;import javacard.security.KeyBuilder;import javacardx.crypto.Cipher;public class Des{private Cipher DESEngine;private Key myKey;private byte[] temp;private RandGenerator rand;public Des(){//必须先初始化(获得实例instance才能init否则报错)DESEngine Cipher.getInstance(Cipher.ALG_DES_CBC_ISO9797_M1, false);//buildKey创建的是未初始化的key,密钥值需用setKey函数手动赋值myKey KeyBuilder.buildKey(KeyBuilder.TYPE_DES, KeyBuilder.LENGTH_DES, false);//设置暂存变量temptemp JCSystem.makeTransientByteArray((short)64, JCSystem.CLEAR_ON_DESELECT);//给rand对象也分配空间,不然无法执行RandGenerator类的代码!!rand new RandGenerator();//****** 1 *******首先自动生成个密钥//产生64bit随机数temp rand.GenrateSecureRand((short)64);//Util.arrayFillNonAtomic(temp1, (short)16, (short)48, (byte)0x11);//设置密钥--拿随机数当密钥((DESKey)myKey).setKey(temp, (short)0);//****** 2 *******初始化加密密钥和加密模式DESEngine.init(myKey, Cipher.MODE_ENCRYPT);}public final void GetCipher(byte[] inBuf, short inOffset, short inLength, byte[] outBuf, short outOffset){//****** 3 *******传入密文进行加密并得到密文//需要特别注意doFinal加密之后的结果估计有64位以上所以outBuf在前面的定义时也要new出足够的大小否则又no precise...DESEngine.doFinal(inBuf, inOffset, inLength, outBuf, outOffset);}}(徒手生成密钥太麻烦所以我这里直接调用生成随机数的API拿随机数来当密钥)接着就是生成随机数的RandGenerator.java文件调用了RandomData APIpackage helloWorld;import javacard.framework.JCSystem;import javacard.security.RandomData;public class RandGenerator{private byte[] temp;//随机数的值private RandomData random;private byte size;//随机数长度//构造函数public RandGenerator(){size (byte)4;temp JCSystem.makeTransientByteArray((short)4, JCSystem.CLEAR_ON_DESELECT);//类当中有getInstance的都要先调用这个函数获取对象实例才能使用其他方法不然6F00random RandomData.getInstance(RandomData.ALG_SECURE_RANDOM);}//产生length长度的随机数并返回public final byte[] GenrateSecureRand(short length){temp new byte[length];//生成4bit的随机数random.generateData(temp, (short)0, (short)length);return temp;}//返回随机数长度public final byte GetRandSize(){return size;}}最后是测试AppletHello.java文件package helloWorld;//import Hello;import javacard.framework.APDU;import javacard.framework.Applet;import javacard.framework.ISO7816;import javacard.framework.ISOException;import javacard.framework.Util;public class Hello extends Applet {//下面这些都是未分配空间的实例化需要后面自己使用new关键字或者用getInstance函数分配空间private Des des new Des();public static void install(byte[] bArray, short bOffset, byte bLength) {// GP-compliant JavaCard applet registrationnew Hello().register(bArray, (short) (bOffset 1), bArray[bOffset]);}public void process(APDU apdu) {// Good practice: Return 9000 on SELECTif (selectingApplet()) {return;}//将缓冲区与数组buf建立映射绑定byte[] buf apdu.getBuffer();short lc apdu.setIncomingAndReceive();//读取data并返回data长度lcbyte[] data new byte[lc];Util.arrayCopyNonAtomic(buf, ISO7816.OFFSET_CDATA, data, (short)0, lc);//byte[] src {h,e,l,l,o,,,w,o,r,l,d};//11 bytesbyte[] cipher new byte[128];byte ins buf[ISO7816.OFFSET_INS];switch (ins) {case (byte) 0x00://INS 0x00 表明要用DES加密//****** 3 *******传入密文进行加密并得到密文des.GetCipher(data, (short)0, lc, cipher, (short)0);Util.arrayCopyNonAtomic(cipher, (short)0, buf, (short)ISO7816.OFFSET_CDATA, lc);apdu.setOutgoingAndSend((short)5, lc);break;//一定要有break否则会继续进入switch循环case (byte) 0x01:break;default:// good practice: If you dont know the INStruction, say so:ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);}}}然后用JCOP Shell工具执行测试。测试脚本(des.jcsh)/select 554433221100/send 00000000041234567804/send 00000000048765432104/第一句表示选定该AID的Applet后两句都是输入一串0x04长度的数据让Applet去执行加密(注意十六进制和十进制数之间转化虽然这里0x04长度等于十进制的4个长度但是0x20就千万记得要转换了)。执行脚本看到结果Applet返回0x04长度的加密后的密文。最后记录几个自己在写代码的过程中遇到的一些需要注意的事项。1因为涉及到了多个类所以会有在另一个类(文件)中建立类的对象但是千万记得要给这个对象分配空间类如果有有getInstance函数的就调用这个函数进行对象的实例化如果没有的就用new关键字来分配空间给对象之前自己就出现了没分配空间给对象的情况结果测试时返回6F00然后调试的时候一直是跳不进去Des.java的因为根本没分配空间给这个对象也就无从谈跳过去执行Des.java里面的代码了。这个在面向对象编程尤其需要注意。2暂存对象(包含变量/数组)与永久对象。用JCSystem.makeTransientByteArray(第一个参数表示数组长度第二个参数表示声明周期(一般用CLEAR_ON_DESELECT也就是该AID的Applet被deselect的时候被回收))函数可以声明一个固定长度的暂存数组。为什么要用到暂存对象呢因为javacard毕竟那么小它所拥有的存储空间(无论是内存或者是ROM(包括那个啥EEPROM))都是很有限的ROM一般是用来存卡片操作系统(COS,一般用汇编写成)和虚拟机(必须下层有操作系统作为基础自己并不是操作系统)的永久对象会存放在EEPROM空间当中而暂存对象(数组)存放在RAM空间中自然读写速度就快很多所以对于需要更新次数频繁的数据并且暂存即可的声明为暂存对象可提高程序效率。同时EEPROM中创建的对象对这些对象的操作必须具有原子性(例如javacard的事务[transaction]处理机制)而RAM里面对象的处理自然不具有原子性。3阅读API里面的函数时容易发现有些在前面带“deprecated”字眼override表示覆盖父类的方法而前面这个表示不建议使用的方法(即将被淘汰或怎样的)一般这个方法都会被删除线划掉。4然后说一个跟des加密不相关的是跟公钥密码系统如RSA算法相关的des这些对称密码系统只需要一个密钥而公钥系统需要公钥私钥所以需要用一个KeyPair对象去存储私钥和公钥而不能用PrivateKey对象和PublicKey对象就算了需要用KeyPair对象囊括住这两个对象后面会继续写RSA算法API调用的blog。5switch相当于一个循环在每一个case后面都必须要加一个break关键字否则执行完一次case之后会继续跑去循环下一次的话case的值是不确定的所以会跳去执行default语句里面的代码所以如果执行的某个case里面没有break程序后面还会执行default里面的语句。6提到对象的初始化(分配空间)注意这个操作一般放在类的构造函数当中如果是Applet主文件就在install()的时候完成这些操作。7最后抽取几个上面的关键函数出来提一提DESEngine Cipher.getInstance(Cipher.ALG_DES_CBC_ISO9797_M1, false);上面这句代码是用来实例化DES引擎对象的做一些分配空间和初始化之类的工作替代了new去完成分配空间的事。myKey KeyBuilder.buildKey(KeyBuilder.TYPE_DES, KeyBuilder.LENGTH_DES, false);然后这句代码是用来创建未初始化的key对象前面我们说到对象你在用它们之前必须给他们先分配空间这里buildKey出来的只是分配好了空白空间的对象后面需要自己用setKey函数来初始化密钥。((DESKey)myKey).setKey(temp, (short)0);这句就是设置(初始化)密钥了temp在这里存的是前面提到的生成的随机数拿来当密钥使。密钥设置好了然后就是将这个密钥扔到DES引擎对象里面去用下面这个函数DESEngine.init(myKey, Cipher.MODE_ENCRYPT);第二个参数表示的是设置模式有加密和解密两种。最后就可以传入数据进行加密得到密文了DESEngine.doFinal(inBuf, inOffset, inLength, outBuf, outOffset);******    更新分隔线   *********这个代码挺不完善的升级版的可以参考我另一篇博文
http://www.sadfv.cn/news/88510/

相关文章:

  • 网站开发工作协议书范本外贸平台运营
  • 课程资源网站开发解决方案暴雪是不是快倒闭了
  • 为什要做网站餐饮加盟网网站建设
  • 二手车网站开发网站设计怎么写
  • 网站seo服务公司重庆公司网站建设价格
  • 织梦做的网站打开不是在国内做推广产品用什么网站好
  • 我需要网站wordprees可以做棋类网站吗
  • 马家堡做网站的公司做网站现在还行吗
  • php团购网站开发企业网站建设的推广方式
  • 品牌网站设计公司哪家好视频网站如何做
  • 可以做软件的网站有哪些网站设置文件夹权限
  • 网站开发工程是待遇中国去中心化搜索引擎
  • 做seo为什么要了解网站企业网站管理系统用哪个好
  • 哪些经营范围可以开网站建设费用高新区网站建设
  • 福州网站推广优化网站作为医院形象建设
  • 秦皇岛手机网站制作多少钱网络营销顾问服务
  • 北京app网站开发建设银行园湖路支行网站
  • 火车票网站建设嘉定个人网站建设
  • 重庆做seo网站优化选择哪家网监备案网站更换域名
  • 固定ip 建网站wordpress微商城主题
  • 学做旗袍衣服的网站帮别人做网站哪里可以接单
  • wordpress 评论系统网络营销推广seo
  • 自己怎么做专属自己的网站做视频赚钱的网站有哪些
  • 网站做语言切换wordpress编辑主题
  • 网站建设合同的内容与结构wordpress 三主题
  • 网站建设 企业网站 框架东营网站建设价钱表
  • 如何建网站和推广网站建设mfdos
  • 网站设计软件microsoft2013看到一个电商网站帮做淘宝
  • 微信网站全称dw做电影网站
  • 贵州建设工程招投标网站wordpress去除帮助