收藏 分享(赏)

javacard实现RSA算法.docx

上传人:scg750829 文档编号:7131282 上传时间:2019-05-06 格式:DOCX 页数:5 大小:16.81KB
下载 相关 举报
javacard实现RSA算法.docx_第1页
第1页 / 共5页
javacard实现RSA算法.docx_第2页
第2页 / 共5页
javacard实现RSA算法.docx_第3页
第3页 / 共5页
javacard实现RSA算法.docx_第4页
第4页 / 共5页
javacard实现RSA算法.docx_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

1、这是一个在 jcop 里写的一个 javacard RSA 标准算法的例子,仅供行内人式参考,如有错误,欢迎批评指正。caokun_package 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;i

2、mport 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; /

3、* 定义 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,(b

4、yte)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

5、)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)0x

6、86,(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,

7、(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,(by

8、te)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

9、)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)0x

10、0D,(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,

11、(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,(by

12、te)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)

13、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() /*

14、构造函数对用到的对象进行初始化 */* 初始化算法类型 得到一个 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);/* 设置私钥指数*

15、/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.setExpon

16、ent(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

17、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*/keyP

18、air = 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, (s

19、hort)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

20、)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, Ci

21、pher.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 = rsaC

22、ipher.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,(sho

23、rt)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,

24、(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, (sh

25、ort)0,(short)128, apdubuf,(short)0);rsaCipher.init(priKey, Cipher.MODE_DECRYPT);len = rsaCipher.doFinal(apdubuf,(short)0, (short)128, apdubuf, (short)0);apdu.setOutgoingAndSend(short)0, (short)128);break;case 0x08: /signaturefor ( short i = 0; i 128; i+)datai =(byte)i;rsaSig.init(priKey, Signature.M

26、ODE_SIGN);len = rsaSig.sign(data, (short)0,(short)128,apdubuf,(short)0);apdu.setOutgoingAndSend(short)0,(short)128);break;case 0x09: / verify the signaturersaSig.init(priKey, Signature.MODE_SIGN);len = rsaSig.sign(data, (short)0,(short)128,sigbuf,(short)0);rsaSig.init(pubKey, Signature.MODE_VERIFY);if (rsaSig.verify(data,(short) 0, (short)128, sigbuf,(short) 0,(short) 128)apdubuf0 = (byte)0xaa;apdubuf1 = (byte)0xbb;apdu.setOutgoingAndSend(short)0, (short)2);elseISOException.throwIt(CryptoException.ILLEGAL_VALUE);break;default:ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报