javacard实现RSA算法.docx_第1页
javacard实现RSA算法.docx_第2页
javacard实现RSA算法.docx_第3页
javacard实现RSA算法.docx_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

这是一个在jcop 里写的一个javacard RSA标准算法的例子,仅供行内人式参考,如有错误,欢迎批评指正。caokun_8341package RSA_Std1024;import javacard.framework.Applet;import javacard.framework.ISO7816;import javacard.framework.ISOException;import javacard.framework.APDU;import javacard.framework.JCSystem;import javacard.security.CryptoException;import javacard.security.KeyBuilder;import javacard.security.KeyPair;import javacard.security.RSAPrivateKey;import javacard.security.RSAPublicKey;import javacard.security.Signature;import javacardx.crypto.*;import javacard.framework.Util;public class RSA_Std1024 extends Applet RSAPrivateKey priKey; /* 定义RSA私钥对象 */RSAPublicKey pubKey; /* 定义RSA公钥对象 */Cipher rsaCipher; /* 定义RSA算法对象 */KeyPair keyPair; /* 定义RSA密钥对对象 */byte mod= /* 定义RSA密钥的模并初始化 */(byte)0xD7,(byte)0x96,(byte)0xFA,(byte)0x18,(byte)0x85,(byte)0xC9,(byte)0xC4,(byte)0x4E,(byte)0x60,(byte)0x78,(byte)0x3A,(byte)0x16,(byte)0x1C,(byte)0x52,(byte)0xE0,(byte)0xF7,(byte)0x61,(byte)0xC6,(byte)0x2F,(byte)0x3F,(byte)0xF3,(byte)0x3E,(byte)0x2E,(byte)0x86,(byte)0xC2,(byte)0xD0,(byte)0x16,(byte)0x84,(byte)0x90,(byte)0x94,(byte)0x5E,(byte)0x9D,(byte)0x6F,(byte)0xF8,(byte)0xCE,(byte)0x5F,(byte)0x62,(byte)0xD4,(byte)0x9C,(byte)0xC0,(byte)0x1E,(byte)0x55,(byte)0x38,(byte)0x4F,(byte)0x92,(byte)0x48,(byte)0xF7,(byte)0x91,(byte)0xAB,(byte)0x10,(byte)0x0B,(byte)0x98,(byte)0xEA,(byte)0x4C,(byte)0xA7,(byte)0x07,(byte)0x90,(byte)0x3E,(byte)0x4F,(byte)0xDF,(byte)0xB9,(byte)0xBE,(byte)0x33,(byte)0x9F,(byte)0x9B,(byte)0xD1,(byte)0x2B,(byte)0x86,(byte)0x93,(byte)0xBB,(byte)0x44,(byte)0xA9,(byte)0x27,(byte)0xEE,(byte)0x51,(byte)0xB2,(byte)0xDD,(byte)0x65,(byte)0x51,(byte)0xFE,(byte)0xEE,(byte)0xF5,(byte)0x8A,(byte)0x4B,(byte)0x47,(byte)0x32,(byte)0x93,(byte)0xCA,(byte)0x09,(byte)0x0F,(byte)0x14,(byte)0x37,(byte)0xFB,(byte)0x15,(byte)0xC7,(byte)0x0C,(byte)0x8B,(byte)0x6C,(byte)0xB2,(byte)0x6C,(byte)0x74,(byte)0x9F,(byte)0x2C,(byte)0x74,(byte)0xBD,(byte)0xA4,(byte)0xBC,(byte)0xF9,(byte)0x38,(byte)0x63,(byte)0x4A,(byte)0x64,(byte)0x29,(byte)0xAE,(byte)0x5B,(byte)0xCD,(byte)0x3A,(byte)0x24,(byte)0xD8,(byte)0x28,(byte)0x17,(byte)0xD5,(byte)0x1D,(byte)0x2A,(byte)0xD1,(byte)0xD6,(byte)0xDD,(byte)0xC7 ;byte priexp= /* 定义RSA私钥指数并初始化 */(byte)0x16,(byte)0x30,(byte)0x32,(byte)0xB3,(byte)0x3D,(byte)0x69,(byte)0xC3,(byte)0xAB,(byte)0x71,(byte)0x60,(byte)0x4E,(byte)0x52,(byte)0x22,(byte)0x3E,(byte)0x21,(byte)0x6B,(byte)0x34,(byte)0x83,(byte)0xEA,(byte)0x2F,(byte)0x01,(byte)0xC0,(byte)0xDF,(byte)0x96,(byte)0xFD,(byte)0x0B,(byte)0xDF,(byte)0x95,(byte)0x6B,(byte)0x2F,(byte)0xEA,(byte)0x00,(byte)0xF8,(byte)0x1A,(byte)0x3A,(byte)0x5B,(byte)0x34,(byte)0xD7,(byte)0xBE,(byte)0xFE,(byte)0x42,(byte)0xE0,(byte)0xF0,(byte)0x77,(byte)0xB8,(byte)0x0D,(byte)0x8C,(byte)0x75,(byte)0x50,(byte)0x8E,(byte)0xC9,(byte)0x32,(byte)0xC6,(byte)0xC2,(byte)0x76,(byte)0xDA,(byte)0x5F,(byte)0x6D,(byte)0x1A,(byte)0x59,(byte)0x63,(byte)0x4B,(byte)0x81,(byte)0x12,(byte)0x76,(byte)0xDE,(byte)0x52,(byte)0xC3,(byte)0x00,(byte)0xFA,(byte)0xE0,(byte)0x0A,(byte)0x20,(byte)0xC2,(byte)0x30,(byte)0x27,(byte)0x46,(byte)0x5E,(byte)0x1D,(byte)0x15,(byte)0x47,(byte)0x85,(byte)0xD8,(byte)0x35,(byte)0xD9,(byte)0x38,(byte)0xC0,(byte)0xB7,(byte)0xA2,(byte)0x49,(byte)0xAB,(byte)0x47,(byte)0x6E,(byte)0xD0,(byte)0xA5,(byte)0x6B,(byte)0x6C,(byte)0x90,(byte)0x23,(byte)0x85,(byte)0xFD,(byte)0xDC,(byte)0x1E,(byte)0x9D,(byte)0x3F,(byte)0x49,(byte)0x68,(byte)0x57,(byte)0xEE,(byte)0x8C,(byte)0xB6,(byte)0xC1,(byte)0x20,(byte)0xAA,(byte)0x4D,(byte)0x90,(byte)0xBE,(byte)0x6B,(byte)0xA6,(byte)0xEA,(byte)0xEF,(byte)0x9D,(byte)0xD3,(byte)0x9E,(byte)0x5A,(byte)0x13,(byte)0x01,(byte)0x59; /* 定义RSA公钥指数并初始化 */byte pubexp = (byte)0x01,(byte)0x00,(byte)0x01;byte data; /* 定义一个byte型数组存放被加密数据 */byte cdata; /* 定义一个byte型数组存放加密结果 */ byte mdata; /* 定义一个byte型数组存放解密结果 */ byte sigbuf; /* 定义一个byte型数组存放签名数据 */Signature rsaSig; /* 签名对象 */short modlen; /* 模的长度 */public RSA_Std1024() /* 构造函数对用到的对象进行初始化 */* 初始化算法类型 得到一个RSA算法的实例 * ALG_RSA_PKCS1 是算法的类型,可以改成以下多种 * ALG_RSA_NOPAD * ALG_RSA_PKCS1_OAEP * */rsaCipher = Cipher.getInstance(Cipher.ALG_RSA_NOPAD, false);/* 创建私钥 */priKey = (RSAPrivateKey)KeyBuilder.buildKey(KeyBuilder.TYPE_RSA_PRIVATE, KeyBuilder.LENGTH_RSA_1024, false);/* 设置私钥指数*/priKey.setExponent(priexp, (short)0,(short)128);/* 设置私钥的模*/priKey.setModulus(mod,(short)0,(short)128);/* 创建公钥*/pubKey = (RSAPublicKey)KeyBuilder.buildKey(KeyBuilder.TYPE_RSA_PUBLIC, KeyBuilder.LENGTH_RSA_1024, false);/* 设置公钥的模*/pubKey.setModulus(mod, (short)0,(short)128);/* 设置公钥的指数*/pubKey.setExponent(pubexp,(short)0,(short)3);data = new byte256; cdata = new byte256;mdata = new byte256;sigbuf = new byte256; rsaSig = Signature.getInstance(Signature.ALG_RSA_SHA_ISO9796, false);/* 安装applet */public static void install(byte bArray, short bOffset, byte bLength) new RSA_Std1024().register();public void process(APDU apdu) /* apdu 命令处理 */short len;if (selectingApplet() /* select applet apdu comand: 00A40400+appletaidlength+appletaid */return;byte apdubuf = apdu.getBuffer();short Len = apdu.setIncomingAndReceive();switch (apdubufISO7816.OFFSET_INS) case (byte) 0x00: /* send apdu 8000000000*/keyPair = new KeyPair(KeyPair.ALG_RSA, (short)1024);keyPair.genKeyPair(); /* 生成密钥对 */priKey = (RSAPrivateKey)keyPair.getPrivate(); /* 取得到RSA私钥 */pubKey = (RSAPublicKey) keyPair.getPublic(); /* 取得到RSA公钥 */len = pubKey.getModulus(apdubuf, (short) 0); /* 取得到RSA的模 */apdu.setOutgoingAndSend(short)0, (short)len); /* 返回RSA的模 */break;case (byte) 0x01: /* send apdu 8001000000 返回公钥指数 */len = pubKey.getExponent(apdubuf, (short)0);apdu.setOutgoingAndSend(short)0, (short)04);break;case (byte) 0x02: /* send apdu 8002000000 返回公钥的模 */len = pubKey.getModulus(apdubuf, (short)0);apdu.setOutgoingAndSend(short)0, (short)128);break;case (byte) 0x03: /* send apdu 8003000000 返回私钥指数 */len = priKey.getExponent(apdubuf, (short)0);apdu.setOutgoingAndSend(short)0, (short)128);break;case 0x04: /* send apdu 8004000000 用私钥对(0-255) 256个字节的数据进行加密*/for ( short i = 0; i 256; i+)datai =(byte)i;rsaCipher.init(priKey, Cipher.MODE_ENCRYPT);len = rsaCipher.doFinal(data, (short)0,(short)128, apdubuf,(short)0);apdu.setOutgoingAndSend(short)0, (short)128);break;case 0x05:/* send apdu 8005000000 用公钥对(0-255) 256个字节的数据进行加密*/for ( short i = 0; i 256; i+)datai =(byte)i;rsaCipher.init(pubKey, Cipher.MODE_ENCRYPT);len = rsaCipher.doFinal(data, (short)0,(short)128, apdubuf,(short)0);apdu.setOutgoingAndSend(short)0, (short)128);break;case 0x06:/* private key encrypt then public key decrypt */for ( short i = 0; i 256; i+)datai =(byte)i;rsaCipher.init(priKey, Cipher.MODE_ENCRYPT);len = rsaCipher.doFinal(data, (short)0,(short)128, cdata,(short)0);apdu.waitExtension();rsaCipher.init(pubKey,Cipher.MODE_DECRYPT);len = rsaCipher.doFinal(cdata, (short)0,(short)128, mdata,(short)0);apdu.waitExtension();if(Util.arrayCompare(data,(short)0,mdata,(short)0,(short)128)=0)Util.arrayCopyNonAtomic(data, (short)0, apdubuf, (short)0, (short)128);apdu.setOutgoingAndSend(short)0, (short)128);elseISOException.throwIt(CryptoException.ILLEGAL_VALUE);break;case 0x07:/* public key encrypt then private key decrypt */for ( short i = 0; i 256; i+)datai =(byte)i;rsaCipher.init(pubKey, Cipher.MODE_ENCRYPT);len = rsaCipher.doFinal(data, (short)0,(short)128, apdubuf,(short)0);rsaCipher.init(priKey, Cipher.MODE_DECRYP

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论