非接触CPU卡外部认证步骤
2016-08-23 10:57
423 查看
最近做一款CPU卡发卡测试工具,由于好长时间没动CPU卡,再拿起来后发现都忘掉了,
外部认证这块还是记一下吧。
现在用的是复旦微的FM1216卡,之前用的是握奇的卡,先说下握奇的外部认证步骤
1、选择IC卡MF目录 00A4 0000 02 3F00 00
2、给IC卡发送命令取随机数 0084000008 获取8位随机数1
3、选择PSAM卡MF目录 00A4000002 3F00 00
4、选择PSAM卡应用目录 00A4000002 1001 00
5、PSAM卡初始化DES加密 801A 27 01 08 8位IC卡序列号
6、PSAM卡DES加密 80FA 00 00 08 8位随机数1
7、IC卡外部认证 0082 0001 08 8位随机数1
这是之前刷卡设备的认证步骤,卡的结构已经建立好了,现在用的是FM1216空卡,
而且我在数据手册上也未找到SAM卡的DES加密指令,这就尴尬了,怎么进行外部认证?
幸好是用的C#做PC端开发,有DES加密接口,空卡默认密钥是8个0xFF,那么直接用程序计算吧。。。
结果竟然认证通过了。。。
下面说下步骤
1、选择IC卡MF目录
2、给IC卡发送取8字节随机数命令
3、使用8个0xFF做密钥,8字节随机数做加密源用C#的系统API进行DES加密
4、将加密后的8字节随机数使用外部认证命令发送到IC卡,验证通过。
这里要说下C#里面DES加密是不允许弱密钥的,8个字节的0xFF会被视为弱密钥报警编译不通过,通过上网查找可通过反射进行强行加密解密
代码:
外部认证这块还是记一下吧。
现在用的是复旦微的FM1216卡,之前用的是握奇的卡,先说下握奇的外部认证步骤
1、选择IC卡MF目录 00A4 0000 02 3F00 00
2、给IC卡发送命令取随机数 0084000008 获取8位随机数1
3、选择PSAM卡MF目录 00A4000002 3F00 00
4、选择PSAM卡应用目录 00A4000002 1001 00
5、PSAM卡初始化DES加密 801A 27 01 08 8位IC卡序列号
6、PSAM卡DES加密 80FA 00 00 08 8位随机数1
7、IC卡外部认证 0082 0001 08 8位随机数1
这是之前刷卡设备的认证步骤,卡的结构已经建立好了,现在用的是FM1216空卡,
而且我在数据手册上也未找到SAM卡的DES加密指令,这就尴尬了,怎么进行外部认证?
幸好是用的C#做PC端开发,有DES加密接口,空卡默认密钥是8个0xFF,那么直接用程序计算吧。。。
结果竟然认证通过了。。。
下面说下步骤
1、选择IC卡MF目录
2、给IC卡发送取8字节随机数命令
3、使用8个0xFF做密钥,8字节随机数做加密源用C#的系统API进行DES加密
4、将加密后的8字节随机数使用外部认证命令发送到IC卡,验证通过。
这里要说下C#里面DES加密是不允许弱密钥的,8个字节的0xFF会被视为弱密钥报警编译不通过,通过上网查找可通过反射进行强行加密解密
代码:
/// <summary> /// DES加密字节数组,可以使用弱密钥 /// </summary> /// <param name="source"></param> /// <param name="key"></param> /// <returns></returns> public static byte[] Encrypt(byte[] source, byte[] key) { DESCryptoServiceProvider des = new DESCryptoServiceProvider(); des.Padding = PaddingMode.None; Type type = Type.GetType("System.Security.Cryptography.CryptoAPITransformMode"); object obj = type.GetField("Encrypt", BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly).GetValue(type); MethodInfo mi = des.GetType().GetMethod("_NewEncryptor", BindingFlags.Instance | BindingFlags.NonPublic); ICryptoTransform desCrypt = (ICryptoTransform)mi.Invoke(des, new object[] { key, CipherMode.ECB, null, 0, obj }); return desCrypt.TransformFinalBlock(source, 0, source.Length); } /// <summary> /// DES字节数组解密,可以使用弱密钥 /// </summary> /// <param name="source"></param> /// <param name="key"></param> /// <returns></returns> public static byte[] Decrypt(byte[] source, byte[] key) { DESCryptoServiceProvider des = new DESCryptoServiceProvider(); des.Padding = PaddingMode.None; Type type = Type.GetType("System.Security.Cryptography.CryptoAPITransformMode"); object obj = type.GetField("Decrypt", BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly).GetValue(type); MethodInfo mi = des.GetType().GetMethod("_NewEncryptor", BindingFlags.Instance | BindingFlags.NonPublic); ICryptoTransform desCrypt = (ICryptoTransform)mi.Invoke(des, new object[] { key, CipherMode.ECB, null, 0, obj }); return desCrypt.TransformFinalBlock(source, 0, source.Length); }
相关文章推荐
- 非接触CPU卡外部认证步骤
- CPU射频卡外部认证的操作步骤
- CPU射频卡外部认证的操作步骤
- Apache 用户认证配置,步骤。
- OpenFire使用外部用户表认证
- 华为5700交换机通过外部开源protal和本地aaa用户认证的一些问题
- WHQL认证(徽标认证)步骤介绍
- VS中,添加c/c++工程外部头文件及库的基本步骤
- 华为5700交换机通过外部开源protal和本地aaa用户认证的一些问题
- openfire的SSL双向认证增加android客户端证书库步骤
- Javacard的内部认证和外部认证
- MongoDB repl set权限认证配置步骤
- 微信公众号之订阅号(已认证)实现oauth2授权登录详细步骤介绍
- 读取外部的SQLdatabase步骤
- vs2010链接外部的库及头文件的步骤
- CPU卡程序设计实例(二十六)卡和ESAM之间外部认证
- MongoDB开启权限认证的方法步骤详解
- Mikrotik OA外部认证
- 使用外部LDAP用户认证后,DJANGO用户如何作登陆的操作?
- OAuth 认证步骤