JAVA 获取一个四位随机数(并且四位数不重复),并说明原理和算法

JAVA 获取一个四位随机数(并且四位数不重复),并说明原理和算法,第1张

每次获取一个一位数的随机数存在一个 int[4]的整型数组,如果新获取的随机数在整型数组中已经存在了,就再获取一次(使用while循环)。然后把int[4]的数转换成四位数(这个应该简单吧,使用sum=sum10+a[i])

由于是第一次接触IC卡,参照着 《FMCOS通用技术手册(复旦微电子)》 进行功能测试及开发。结果在进行卡片外部认证时未注意返回状态码含义,导致卡片意外锁死。

我所使用的卡片是FM1280-169-C1,可以肯定的是只要卡片是复旦微电子生产的,我所遇到的问题都应该是适用的。

先阐述一下问题产生的过程: 卡片复位->选择主目录->外部认证(获取随机数+发送DES加密的密钥)->失败次数超过规定次数->卡片死锁

翻译为APDU指令(如果APDU出现空格,实际发送APDU时应去掉空格):

<- reset

-> (复位返回的数据)

<- 00A4 0000 02 3F00(选择主目录3F00)

-> 6F10840E315041592E5359532E44444630319000

<- 0084 0000 04(获取自由数)

-> 06CEE4F29000

<- 0082000008FEC63184B307AEFD(06CEE4F200000000 与秘钥 FFFFFFFFFFFFFFFF 进行单倍长DES加密得到 FEC63184B307AEFD)

-> 6983

正常情况下,最后一条指令应该返回9000,即外部认证密钥通过。但是会有各种各样的原因,比如外部认证密钥错误、计算单倍长DES错误,APDU指令错误等,然后 *** 作错误重试次数便会将密钥锁死。

我是一开始并不知道如何计算单倍长DES,加上不知道如何使用自由数,多尝试了几次后才发觉已经锁死。。。。(获取的自由数是06CEE4F29000,其中后面的9000其实是状态码,然后计算的时候需要用0补齐16个字符,便得到06CEE4F200000000 )

1尝试额外添加一条密钥,发送APDU指令

<-80D401011539F0F0AA88FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

-> 9000

<- reset

-> (复位返回的数据)

<- 00A40000023F00(选择主目录3F00)

-> 6F10840E315041592E5359532E44444630319000

<- 0084000004(获取自由数)

-> 06CEE4F29000(此卡片返回的内容注意需要根据卡片实际返回值为准)

<- 0082  0001  08 FEC63184B307AEFD(06CEE4F200000000 与秘钥 FFFFFFFFFFFFFFFF 进行单倍长DES加密得到 FEC63184B307AEFD, 注意加粗部分 )

-> 9000

<- 800E000000( 清除目录文件数据 )

-> 9000

<- 80E0 000007 3F00 6C01FAFFFF(建立密钥文件)

-> 9000

<- 80D4 01000D F9F0F0AA88 FFFFFFFFFFFFFFFF(写入密钥文件)

-> 9000

这个时候,卡片外部认证密钥便又回到了 FFFFFFFFFFFFFFFF,错误计数器也复位了。

问题顺利解决。

这个解决方法分享给大家~~~ ,此解决方法是有局限的,即只有未设置其他密钥的情况下才适用,如果第一步增加密钥错误,即意味着此方法对你无效。。。。。

PS:如果你卡片很多,死锁后丢掉即可,土豪随意。而我需要开发一个应用,手上只有两张测试卡片。

如有任何疑问可以联系我:tinyqiu@qqcom

从6张卡片上分别写有数字1,2,3,4,5,6,从这6张卡片中随机抽取2张的结果数如下

(1,2)(1,3)(1,4)(1,5)(16)(2,3)(2,4)(2,5)(2,6)(3,4)(3,5)(3,6)(4,5)(4,6)(5,6)共15种结果,每种结果等可能出现,属于古典概率

记“取出的2张卡片上的数字之和为奇数”为事件A,则A包含的结果有:(1,2)(1,4)(1,6)(2,3)(2,5)(3,4)(3,6)(4,5)(5,6)共9种结果

由古典概率公式可得P(A)=

9
15
3
5

故答案为:

3
5

依题要使取出的2张卡片上的数字之和为奇数,

则取出的2张卡片上的数字必须一奇一偶,

∴取出的2张卡片上的数字之和为奇数的概率P=

C

12

C

12

C

24

=

4

6

=

2

3

,

故选C

获取随机数的方法,参数是需要获取的随机数的长度

/

需要的长度

@param length

/

private static void getRadom(int length){

//获取一个随机数

double rand = Mathrandom();

//将随机数转换为字符串

String str = StringvalueOf(rand)replace("0", "");

//截取字符串

String newStr = strsubstring(0, length);

Systemoutprintln(newStr);

}

其实就是利用Mathrandom()方法生成一个随机的double数,然后转换为字符串,在字符串中去做 *** 作

以上就是关于JAVA 获取一个四位随机数(并且四位数不重复),并说明原理和算法全部的内容,包括:JAVA 获取一个四位随机数(并且四位数不重复),并说明原理和算法、FMCOS外部认证死锁的解决办法、6张卡片上分别写有数字1,2,3,4,5,6,从这6张卡片中随机 抽取2张,则取出的2张卡片上的数字之和为奇等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9626365.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-30
下一篇2023-04-30

发表评论

登录后才能评论

评论列表(0条)

    保存