国密PSAM卡与CPU(用户卡)操作过程 小结

1-终端+PSAM+CPU用户卡 常规的操作过程

PSAM 卡是作为秘密密钥的载体,专门执行加密和数字签名等任务;                                                                                           所有它常常跟一个MCU或者终端设备组在一起构成一个整体;

CPU用户卡作为一个从设备;psam也是一个载体,两者都是卡片,或者说都是从设备。它们之间是无法相互访问的

     比如:从应用的角度来看,终端设备比如说 ATM 机,我们可以把他看作包含 PSAM 才构成整体。而CPU用户卡,对 ATM 机来说,则是外部设备。当需要对用户卡片(CPU卡)进行操作的时候,实际上终端设备是交替地访问cpu用户卡和 PSAM,按协议流程来完成安全协议规定的操作。

比如说外部认证,是要让psam卡片确认终端设备的合法性(实质上是检验它(终端设备)是否持有共享的密钥):
1 终端设备向cpu用户卡发送取随机数命令,得到一个卡片生成的随机数(获得卡片的随机数)。
2 终端设备向 PSAM 卡发送一个加密命令,使其对上述随机数加密(获得密文)。
3 终端设备向cpu用户卡片发送带有上述加密结果(密文)的外部认证命令。CPU用户卡片进行验证后,确定认证是否成功。如果成功,则可以进行后续的安全操作。(用获得的密文来进行认证

     当然,实际的过程还要复杂一些,因为要抗御暴力攻击每一次外部认证是要生成一个过程密钥的。上述简化过程是仅仅是为了说明这种交替访问的情景。

通过认证来正确访问到用户卡里的内容,接下来我自己归纳一下这一步骤。
假定我已经写好了ISO7816协议和ISO14443协议,通过这两个协议分别给PSAM卡和用户卡发送APDU指令。
如果我要查看用户卡中某应用文件的内容时,其详细步骤伪代码

(相关指令查看我博客:智能卡操作(非接触CPU卡又称智能卡) 总结)

/* 参考连接:https://bbs.csdn.net/topics/390652402?page=1
*  a)给用户卡发送选择应用文件的APDU命令===========================00 a4=======
*/
void CPU_SelectFile(void);
/*
*  b) 向用户卡发送获取随机数的APDU命令。返回值:R(得到的随机数)=====00 84======
*  @Return R:产生的随机数
*/
R CPU_GetChallenge(void);  
/*
*  c) 向PSAM卡发送加密命令,对随机数进行加密。=====================00/04 d6===
*  @Param  R:随机数
*  @Return Re:加密后的随机数
*/
Re PSAM_Encode(R);
/*
*  d) 向用户卡发送外部认证命令。===================================00 82=======
*  @Param  Re:加密后的随机数
*          Ki:秘钥标识符 
*/
void CPU_External_Authentication(Re, Ki);
 
/*
*  外部验证成功后,用户卡内状态机改变为所用秘钥的后续状态, 下面可以对应用文件进行操作...
   -------------接下来对应用文件进行操作---------
*/

2-

(待续)

  • 5
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
### 回答1: Java国密签名与验签是基于国密算法实现的数字签名和验证数字签名的过程。 国密算法是中国自主研发的一种加密算法标准,包括SM2、SM3和SM4等。其中,SM2是基于椭圆曲线密码算法的公钥密码算法,SM3是基于SHA-256的消息摘要算法,SM4是一种分组密码算法。 在Java中,可以使用Bouncy Castle等库来支持国密算法。对于国密签名,可以通过生成SM2椭圆曲线的密钥对,即私钥和公钥。私钥用于签名生成数字签名,公钥用于验证数字签名。通过调用相应的方法,可以实现对数据的签名和验证。 签名的过程如下:首先,使用私钥对待签名的数据进行加密,并生成数字签名。然后,可以将签名和加密后的数据一同传输给接收者。接收者可以使用对应的公钥进行解密和验证。 验签的过程如下:首先,接收到签名和加密后的数据。然后,使用公钥对密文进行解密,得到原始数据。接着,使用公钥和原始数据进行验证,验证签名的有效性。 在Java中,可以通过调用相应的方法来实现国密签名与验签的功能。具体的操作步骤和参数设置可以参考相关的API文档和资料。 总的来说,Java国密签名与验签是基于国密算法的数字签名和验证的过程,通过生成密钥对、加密解密和验证签名等操作来实现。 ### 回答2: Java国密签名和验签是指在Java编程语言中使用国密算法进行数字签名和验证签名的过程。 首先,国密算法是指由中国自主设计和广泛应用的密码学算法,具有较高的安全性和可靠性。 在Java中,可以使用Bouncy Castle库来支持国密算法。该库提供了一组接口和类,可以方便地实现国密签名和验签操作。 国密签名的过程如下: 1. 选择合适的国密算法,例如SM2。 2. 生成签名密钥对,包括私钥和公钥。 3. 使用私钥对待签名的数据进行签名,生成签名值。 国密验签的过程如下: 1. 选择相同的国密算法,例如SM2。 2. 获取对方的公钥。 3. 使用公钥对签名值和待验证数据进行验签,得到验签结果。 Java提供了一些实现国密签名和验签的类和方法,例如Signature类和KeyPairGenerator类。可以通过这些类来实现国密签名和验签的功能。 在使用Java国密签名和验签时,需要注意以下几点: 1. 熟悉相应的国密算法标准和规范。 2. 使用安全随机数生成器生成密钥对。 3. 对签名值和待验证数据进行适当的编码和解码。 4. 注意保护私钥的安全性,避免私钥泄露。 总之,Java国密签名和验签是利用Java编程语言实现的国密算法的数字签名和验证签名的过程。通过使用相关的类和方法,可以方便地实现这些功能,并提供一定的安全性和可靠性。 ### 回答3: Java国密签名与验签是指在Java编程语言中实现国密算法对数据进行签名和验证的过程。 国密算法是我国自主开发的一套密码算法标准,其目的是为了保护国家重要信息的安全。在Java中,可以通过使用BouncyCastle等第三方库来实现国密算法的签名和验签功能。 签名的过程是指使用私钥对待签名的数据进行加密,生成一个带有数字签名的数据。而验签的过程则是使用公钥来对签名数据进行解密,并通过比对原始数据和解密后的数据是否一致来判断数据的完整性和真实性。 在Java中,可以通过以下步骤来实现国密签名与验签: 1. 首先生成公钥和私钥。可以使用Java的密钥对生成器(KeyPairGenerator)类来生成。 2. 使用私钥进行签名。可以使用Java的签名(Signature)类来进行签名操作。首先需要初始化签名对象,并传入私钥,然后使用update方法传入待签名的数据,最后调用sign方法进行签名。 3. 使用公钥进行验签。同样使用Java的签名(Signature)类,首先需要初始化验签对象,并传入公钥,然后使用update方法传入待验签的数据,最后调用verify方法进行验签。如果验签通过,则返回true,否则返回false。 需要注意的是,在进行签名和验签之前,需要确保私钥和公钥的正确性和完整性,同时还需要保证签名数据和原始数据的一致性。 通过以上步骤,就可以在Java中实现国密签名与验签的功能。这种方式可以用于保护数据的完整性和真实性,以及确保数据在传输过程中不被篡改。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaoxilang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值