答案:C
目前常用的非对称加密算法中主要的公钥算法包括RSA算法、DSA算法、PKCS算法与PGP算法等。非对称加密技术对信息的加密和解密使用不同的密钥,用来加密的密钥是可以公开的,用来解密的私钥是需要保密的。非对称加密技术可以大大简化密钥的管理,网络中N个用户之间进行加密通信,仅仅需要使用N对密钥。换言之,加密通信系统共有2N个密钥。因此C选项正确。
NIH的根本任务就是合理使用纳税人的钱支持生物医学研究,因此,NIH需要根据其资助策略制定合理的基金分配及预算方案。其中约82% 的预算用于NIH 的院外研究项目(extramural research program),系通过基金或协议的方式资助美国国内外2000余个研究机构;10% 的预算用于NIH的院内研究项目(intramural research program),资助NIH内部直属实验室的2 000余项研究项目;另有约8% 左右的预算作为院内院外研究项目的共同基金。NIH的院内研究项H归院内研究处管辖,负责所有与院内研究、培训、技术转让有关的政策法规、审核、立项、实施管理及实验室、临床医院之间的协调等。
NIH的院外研究项目由院外研究处管理,负责NIH基金政策的制定、实施等。对NIH以外的研究机构主要有三种资助方式:基金(grants)、合作协议(cooperative agreements),和约(contracts)。基金是最主要的资助方式, 支持各种与人类健康相关的研究项目和培训计划,一般由申请者个人提出研究日标,经评审通过后获得基金支持, 资助年限l~5年, 资助机构不参与项目的研究过程;合作协议则事先由资助机构对研究计划提出相应规定并发布特别申请须知ra specific request for applications,RFA),有时为了激发科学家对某些特殊领域的兴趣,还会发布项目声明(a program announcement,PA);研究与
开发(research and development,R&D)合同则是资助学术机构、非盈利性或商业性机构就NIH感兴趣的特殊领域进行研究和开发,例如,抗乳腺癌和卵巢
癌的化疗药物Taxol(泰素)的研发就是NIH签署的众多协议之一 。
NIH的研究基金(the NIH research grant budget)分四种:研究项目基金(research project grants,RPGs)、研究中心基金(research center grants)、小业创新研究一小企业技术转让基金(small business innovative research—small business technology transfer grants.SBIR—SBTTG)及其他研究基金(other research grants)。 重点资助科学家的个人申请项目,从分子、细胞生物学研究到新药研发均在其资助范围之内。包括RC1、R01、R03、R15、R21(CAN423702及423825除外)、R22、R23、R29、R33、R35、R37、R55、P01、P42、UC1、U19及自1980财政年度至今的MGMSP4l基金; 自1993财政年度至今的UO1基金。不包括NLM 基金、1990财政年度之前的NCRR和1986财政年度的NCNR基金。其中最主要的基金是
R01;有的RPGs称为项目计划基金(program project grants), 旨在资助多学科交叉领域的研究, 由多个专家参与,各负责一个问题的研究。
R01:研究计划基金一一Research ProjectGrants,资金下拨到美国国内外各研究机构, 资助科学家个人的研究项目,是NIH资助的主要方式。
R03:小额基金— — Small Grants,资助前期或短期研究项目。
R09:学术评审基金——Scientific Evaluation,作为申请书初评小组主席的活动经费。
R13:会议基金—— Conference Grants, 旨在资助与研究项目相关的会议交流。
R1 5:学术研究加强基金— — Academic Research Enhancement Awards,资助小规模创新性研究或研究技术的开发或对前期工作结果的进一步分析。
R1 8:研究成果验证与推广计划—— Research Demonstration and Dissemination Projects,资助保健措施的研究开发、检测和健康知识的推广应用。
R21:探索,发展基金I—— Exploratory/Developmental Grants Phase I,有期限和水平要求, 旨在鼓励对特定领域进行创新性研究,申请必须符合R21项目的RFAs和PAs要求。
R24:资源相关研究计划—— Resource—Related Research Projects,资助对已有的研究资源在生物医学领域进行开发利用。
R33:探索,发展基金II— — Exploratory,Developmental Grants phase II,属II期资助基金,用于对原有的R2l项目进行更深入的创新性、探索性研究, 申请人必须是R21基金获得者, 申请要符合R21项目的RFAs和PAs要求。
R34:临床试验计划基金—— Clinical Trial Planning Grant,资助临床试验的初期工作, 如成立研究队伍、研发数据处理工具、设计实验流程等。
R37:研究拓展长期资助基金—— Method to Extend Research in Time(MERIT)Awards,对成就突出的科学家的长期资助,初期为5年,之后可继
续资助3—5年。名额有限, 由NIH的顾问及管理人员选定被资助人。
R41和R42: 小企业技术转让基金— — Small Business Technology Transfer(STTR)Grants, 旨在资助小企业与研究机构之间的R&D合作计划, 是
由国会直接制定的资助项目, 同SBIR。也分两期进行资助,I期基金(R41)系可行性投资:II期基金(R42)系对产品的进一步开发。
R43和R44:小企业创新研究基金— — Small Business Innovation Research(SBIR)Grants, 旨在资助小企业与研究机构之间的R&D合作计划,是
由国会直接制定的资助项目,分两期进行资助,I期基金(R43)系实验性投资,对研究项目是否可转化为商业产品进行技术和可行性分析;II期基金(R44)系对项目的进一步开发。 (fellowship programs)
F3 1: 少数民族及残疾人博士前个人研修基金 Individual Predoctoral National Research Service Award(NRSA)Fellowships for Minority Students and Students with Disabilities。
F32:博士后个人研修基金 Postdoctoral Individual National Research Service Awards(NRSA)。
F33:资深研究人员国家研修基金 NationalResearch Service Awards for Senior Fellows(NRSA),
资助对象为有经验的研究人员, 旨在促进其研究事业的发展,培养良好的学术背景和研究技能。
F35:NIH院内研究项目中的博士后个人基金 Intramural National Research Service Awards (NRSA)Individual Postdoctoral Program。 (research career programs)
K01:科学家研究与培训发展基金—— Research Scientist Development Awards Research and Training, 旨在资助科学家的技能培训和事业发展。
K02-独立科学家基金 Independent Scientist Awards,资助刚开始独立主持研究工作的科学家和临床医生,替代了原有的K02和K04基金。
K06:研究事业基金 ResearchCareerAwards。各研究所对优秀研究人员的研究事业进行的资助。
K08~临床科学家发展基金 Mentored Clini.cal Scientist Development Awards,期限3~5年,替代了原有的K08、K11和K15基金。
K22:研究学者发展基金 Research ScholarDevelopment Award,资助学术研究机构博士后人员向助理教授发展的启动基金。
K23: 临床研究事业发展基金 Mentored Patient-Oriented Research Career Development Award,旨在资助从事临床研究的青年科学家。
K24:中年资研究人员临床研究基金 Midcareer Investigator Award in Patient.Oriented Research,资助中等年资的科学家继续从事临床研究并指导青年医生。
K25: 定量研究事业发展基金 MentoredQuantitative Research Career Development Award,资助生物医学领域以外的、有良好学术背景和工程学背景的低年资研究人员,旨在促进交叉领域的研究。
K30:临床研究路线基金— — Clinical Research Curriculum Award,资助目前尚未开展的新临床研究项目或拓展现有的研究项目。 (research and development related contracts)
NO1:研究与发展合同— — Research and Development Related Contracts,资助科学研究所需的新产品或技术的研发。 (research program projects and centers)
P0 1:研究项目计划一一Research Program Projects,资助对象为首席科学家牵头的跨学科、多领域长期研究项目。
P30:研究中心核心基金一一Center Core Grants,资助研究方向相同的跨学科研究团队。
P50:特殊研究中心计划一一Specialized Centers,资助对象为从基础到临床的各R&D合同项目。 (training programs)
TU2:NIH院内研究机构国家研究辅助基金Institutional National Research Service Award With Involvement of NIH Intramural Faculty(0D),针对T32项目,资助研究机构为人才短缺的特殊领域的大学生及博士后研究人员提供技术培训。
T32-研究机构国家研究辅助基金—— Institutional National Research Service Awards(NRSA),资助学术机构对博士前及博士后人员进行培训。T35-NRSA短期研究个人培训基金—— NRSAShort-Term Research Training Awards (cooperative agreements)
U01:研究计划合作协议— — Research Projects Cooperative Agreements,与基金相似,系NIH对基金获得者的附加投资,从而NIH也成为研究计划的参与者。
Ul9:研究项目合作协议— — Research Programs Cooperative Agreements,旨在资助目标相同的多个研究计划进行跨学科、长期合作。
U24:资源相关性研究计划合作协议— — Resource—Related Research Projects Cooperative Agreements,系对多方投资研究项目的附加资助,
旨在加强相关研究资源在生物医学研究中的应用。
U43:SBIR合作协议I期— — Small Business Innovation Research(SBIR)Cooperative Agreements Phase I,系对小企业与研究机构间R&D合作计划的附加资助。I期基金系实验性投资, 对研究项目是否可转化为商业产品进行技术和可行性分析。
U44:SBIR合作协议II期—— Small Business Innovation Research(SBIR)Cooperative Agreements Phase II,系对小企业与研究机构间R&D合作计划的附加资助。II期基金系对项目的进一步开发。
U54:特殊研究中心合作协议—— Specialized Centers Cooperative Agreements,资助从基础到临床的跨学科生物医学研究。
U56:探索基金合作协议— — Exploratory Grants Cooperative Agreements,用于对新项目或已有研究项目的深入研究或跨学科项目的可行性研究。
UC1:NIH挑战基金及参与者项目基金II期 NIH Challenge Grants and Partnerships Program Phase II,Cooperative Agreements(NIAID), 旨在资助NIH与国内外研究机构间的合作,加速生物医学或生物技术领域R&D研究成果在传染性疾病方面的应用。 (interagency intra agency agreements)
Y01:NIH代理间协议— — NIH Interagency Agreements,资助HHS以外的政府机构进行研究或特殊产品开发。
Y02:NIH代理内部协议—— NIH Intra—agency Agreements,资助NIH内部其他机构或HHS其他部门进行研究或产品开发。 NIH有一套严格而成熟的评审体系(the peer review system),分两个层次(二级评审制度), 申请书的学术评审与基金资助是分别独立进行的。申请书填写完毕后先送交NIH的科学评审中心(the Center for Scientific Review,CSR), 由CSR的工作人员根据申请书的研究内容等选择最适宜的初评专家小组和最对口的资助研究所或研究中心, 并进行编号, 然后送往相应领域的科学评审小组(Scientific Review Groups,SRGs,或study sections),就其科学性和技术问题进行审核。SRGs是申请书评审的主要负责部门,是该评审系统的核心,主要
由各研究领域或医学专业著名的非政府科学家组成,成员一般16~20人, 由相应的科学评审管理官员(scientific review administrator,SRA)负责管理。
目前,CSR大约有125个SRGs, 负责大多数个人申请项目(如R01)的评审。各评审专家在会审之前要对每份申请书单独审阅,其中2~3位专家还要求准备书面意见。对申请1=;的评审主要有以下几方面的标准:项目的重要意义、项目的创新性、研究方法与研究目标的符合性、申请人的资格及工作背景、工作条件和学术环境。对于非常有竞争力的近半数申请书会做进一步的充分讨论,并就其学术性给予定量评分。评审的第二步是送交NIH各研究所或研究中心的国家顾问委员会(the National Advisory Boards or Councils)。委员会由科学家和关注健康问题的各界代表组成,成员一般12~18人,对通过一审的申请书就其整体水平、研究目的、资助单位的基金预算及SRGs的一审意见进行全面审核。R&D合同基金申请书的内容必须符合RFP(the request for proposa1)中政府所作的规定, 因此,其评审过程与普通申请书不同,要经过多方审阅。一般先由各研究所的项目管理人员,根据院外顾问专家的意见生成初步研究计划,经NIH的项目管理人员完善后才形成正式RFP,就申请人应该完成的工作做出明确规定。为了让科学界尽可能广泛地了解情况,通常会刊登在《每日商报》(the Commerce Business Daily)或通过其他渠道公示。申请书上报后, 由非政府科学家组成的技术评审小组, 根据RFP的要求对其进行审核。根据评审专家的意见及NIH管理人员的意见决定申请者是否具有竞争力,是否需要进行面审。面审后, 申请者要重新提交最后的、最佳修改方案,只有最符合政府要求的方案才可得到资助。极少数情况下,各研究所也会对符合NIH特殊项目要求的非招标申请书进行资助。对NIH院内研究项目、计划和申请人的评审则由相应的科学顾问理事会(Boards of Scientific Counselors)负责。理事会由各研究领域成就卓著的非政府科学家组成,对在研项目、申请项目及NIH科学家的_[作和成绩进行评价。理事会肩负双重责任,不仅要对研究项目和研究人员进行专业学术评估,对各研究所的院内工作也要给予综合评价。从递交申请书到最终确定资助对象要经过上述两级评审过程,一般至少需要9个月的时间,特殊情况下最快也要6个月。从法律上讲, 任何项目必须通过二审才可资助。二审后, 申请人可能会得到资助通知, 也可能允许修改后再次申请。日前NIH的资助率为1/3。除了对申请书进行评审之外,会审专家组的另一任务是在评审结束后将各领域的相对资助率进行综合, 平衡各研究领域的资助力度, 因而,每个会审专家组的组成和变化都会对NIH各资助领域产生重要影响,正因为如此,NIH对会审专家组的任何变动都持极为谨慎的态度。每年NIH大约要评审43 400份研究和培训项目。据最新数据显示,NIH 正在资助的项目多达46 700项,涉及美国国内外各主要大学、医学院校和其他研究及培训机构。
NIH的评审系统: 申请人提交申请书,每年大约有35000份——评审专家就申请书的学术问题进行审阅——评审专家及公众代表对申请书进一步审核,确定资助对象——最终仅32% 的申请人能够最终获得资助。
院内研究项目占NIH 总预算的少部分,限NIH 内部使用。主持NIH 院内研究的主力军都是世界一流的科学家, 他们跨院所、跨学科相互合作,在NIH的实验室里自由探索科学问题, 内容涉及生物学基础、行为学研究、疾病治疗等各个方面。NIH的院外研究项目遍布美国各州及国外最重要的大学和医学院校,研究领域涉及生物医学的各个方面。
目前,从事NIH院外和院内研究项目的雇员共有18 000名, 院内职员主要包括院内科学家、医生、牙科医生、兽医、护士、实验室工作人员、行政管理人员、其他辅助人员及不断更新的进修研究人员,其中4 000多人是专业科研人员。科学的进步主要依靠科学家的努力,因此,NIH对研究人员的培训投以巨资,现在仍有大约50000名杰出的研究人员正在接受博士研究生(research doctorate degrees)的培训。
(200804)采用RSA算法,网络中N个用户之间进行加密通信,需要的密钥个数是 。
A)N ×(N-1) B)N C)2N D)NN
解析:RSA算法使用方便,尤其是公开密钥的特征使得用户在数据传输之前无须交换密钥,即使和多个用户进行秘密通信,也无须记忆太多密钥;原理上,N个用户进行通信,需要N对密钥,但每个用户只需记忆自己秘密密钥,并去公共存储区获取其他用户的公开密钥,所以答案是B。
n=pq=35
所以我们可以得出p=5,q=7
φ(n)=(p-1)(q-1)=24
取e=5
de=1 mod φ(n)
可以得出d=5
也就是说私钥(d,n)=(5,35)
M=(C^d) mod n=(2^5) mod 35=32
答案:B
选出两个大质数p和q,使得p≠q
计算p×q=n
计算=(p-1)×(q-1)
选择e,使得1<e<(p-1)×(q-1),并且e和(p-1)×(q-1)互为质数
计算解密密钥,使得ed=1mod (p-1)×(q-1)
公钥=e,n
私钥=d,n
公开n参数,n又称为模
消除原始质数p和q
由(e,n)=(13,35)可以得知 PQ=35,pq为素数,因此PQ为5和7
(N)=24,
已经选定e=13,则满足13d=1 mod 24 的d是13 ,因为1313 mod 24 余数为1
此题可以直接套公式计算更方便。
1978年就出现了这种算法,它是第一个既能用于数据加密也能用于数字签名的算法。
它易于理解和操作,也很流行。算法的名字以发明者的名字命名:Ron Rivest, Adi
Shamir 和Leonard Adleman。但RSA的安全性一直未能得到理论上的证明。
RSA的安全性依赖于大数分解。公钥和私钥都是两个大素数( 大于 100
个十进制位)的函数。据猜测,从一个密钥和密文推断出明文的难度等同于分解两个
大素数的积。
密钥对的产生。选择两个大素数,p 和q 。计算:
n = p q
然后随机选择加密密钥e,要求 e 和 ( p - 1 ) ( q - 1 ) 互质。最后,利用
Euclid 算法计算解密密钥d, 满足
e d = 1 ( mod ( p - 1 ) ( q - 1 ) )
其中n和d也要互质。数e和
n是公钥,d是私钥。两个素数p和q不再需要,应该丢弃,不要让任何人知道。
加密信息 m(二进制表示)时,首先把m分成等长数据块 m1 ,m2,, mi ,块长s
,其中 2^s <= n, s 尽可能的大。对应的密文是:
ci = mi^e ( mod n ) ( a )
解密时作如下计算:
mi = ci^d ( mod n ) ( b )
RSA 可用于数字签名,方案是用 ( a ) 式签名, ( b )
式验证。具体操作时考虑到安全性和 m信息量较大等因素,一般是先作 HASH 运算。
RSA 的安全性。
RSA的安全性依赖于大数分解,但是否等同于大数分解一直未能得到理论上的证明,因
为没有证明破解
RSA就一定需要作大数分解。假设存在一种无须分解大数的算法,那它肯定可以修改成
为大数分解算法。目前, RSA
的一些变种算法已被证明等价于大数分解。不管怎样,分解n是最显然的攻击方法。现
在,人们已能分解140多个十进制位的大素数。因此,模数n
必须选大一些,因具体适用情况而定。
RSA的速度。
由于进行的都是大数计算,使得RSA最快的情况也比DES慢上100倍,无论是软件还是硬
件实现。速度一直是RSA的缺陷。一般来说只用于少量数据加密。
RSA的选择密文攻击。
RSA在选择密文攻击面前很脆弱。一般攻击者是将某一信息作一下伪装(
Blind),让拥有私钥的实体签署。然后,经过计算就可得到它所想要的信息。实际上
,攻击利用的都是同一个弱点,即存在这样一个事实:乘幂保留了输入的乘法结构:
( XM )^d = X^d M^d mod n
前面已经提到,这个固有的问题来自于公钥密码系统的最有用的特征--每个人都能使
用公钥。但从算法上无法解决这一问题,主要措施有两条:一条是采用好的公钥协议
,保证工作过程中实体不对其他实体任意产生的信息解密,不对自己一无所知的信息
签名;另一条是决不对陌生人送来的随机文档签名,签名时首先使用One-Way Hash
Function
对文档作HASH处理,或同时使用不同的签名算法。在中提到了几种不同类型的攻击方
法。
RSA的公共模数攻击。
若系统中共有一个模数,只是不同的人拥有不同的e和d,系统将是危险的。最普遍的
情况是同一信息用不同的公钥加密,这些公钥共模而且互质,那末该信息无需私钥就
可得到恢复。设P为信息明文,两个加密密钥为e1和e2,公共模数是n,则:
C1 = P^e1 mod n
C2 = P^e2 mod n
密码分析者知道n、e1、e2、C1和C2,就能得到P。
因为e1和e2互质,故用Euclidean算法能找到r和s,满足:
r e1 + s e2 = 1
假设r为负数,需再用Euclidean算法计算C1^(-1),则
( C1^(-1) )^(-r) C2^s = P mod n
另外,还有其它几种利用公共模数攻击的方法。总之,如果知道给定模数的一对e和d
,一是有利于攻击者分解模数,一是有利于攻击者计算出其它成对的e’和d’,而无
需分解模数。解决办法只有一个,那就是不要共享模数n。
RSA的小指数攻击。 有一种提高
RSA速度的建议是使公钥e取较小的值,这样会使加密变得易于实现,速度有所提高。
但这样作是不安全的,对付办法就是e和d都取较大的值。
RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。RSA是被研
究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为
人们接受,普遍认为是目前最优秀的公钥方案之一。RSA
的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难
度等价。即RSA的重大缺陷是无法从理论上把握它的保密性能如何,而且密码学界多数
人士倾向于因子分解不是NPC问题。
RSA的缺点主要有:A)产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次
一密。B)分组长度太大,为保证安全性,n 至少也要 600 bits
以上,使运算代价很高,尤其是速度较慢,较对称密码算法慢几个数量级;且随着大
数分解技术的发展,这个长度还在增加,不利于数据格式的标准化。目前,SET(
Secure Electronic Transaction
)协议中要求CA采用2048比特长的密钥,其他实体使用1024比特的密钥。
DSS/DSA算法
Digital Signature Algorithm
(DSA)是Schnorr和ElGamal签名算法的变种,被美国NIST作为DSS(Digital Signature
Standard)。算法中应用了下述参数:
p:L bits长的素数。L是64的倍数,范围是512到1024;
q:p - 1的160bits的素因子;
g:g = h^((p-1)/q) mod p,h满足h < p - 1, h^((p-1)/q) mod p > 1;
x:x < q,x为私钥 ;
y:y = g^x mod p ,( p, q, g, y )为公钥;
H( x ):One-Way Hash函数。DSS中选用SHA( Secure Hash Algorithm )。
p, q,
g可由一组用户共享,但在实际应用中,使用公共模数可能会带来一定的威胁。签名及
验证协议如下:
1 P产生随机数k,k < q;
2 P计算 r = ( g^k mod p ) mod q
s = ( k^(-1) (H(m) + xr)) mod q
签名结果是( m, r, s )。
3 验证时计算 w = s^(-1)mod q
u1 = ( H( m ) w ) mod q
u2 = ( r w ) mod q
v = (( g^u1 y^u2 ) mod p ) mod q
若v = r,则认为签名有效。
DSA是基于整数有限域离散对数难题的,其安全性与RSA相比差不多。DSA的一个重要特
点是两个素数公开,这样,当使用别人的p和q时,即使不知道私钥,你也能确认它们
是否是随机产生的,还是作了手脚。RSA算法却作不到。
这个不好说,什么情况都可能不是吗。
RSA是目前最有影响力的公钥加密算法,该算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥,即公钥,而两个大素数组合成私钥。公钥是可发布的供任何人使用,私钥则为自己所有,供解密之用。
解密者拥有私钥,并且将由私钥计算生成的公钥发布给加密者。加密都使用公钥进行加密,并将密文发送到解密者,解密者用私钥解密将密文解码为明文。
以甲要把信息发给乙为例,首先确定角色:甲为加密者,乙为解密者。首先由乙随机确定一个KEY,称之为密匙,将这个KEY始终保存在机器B中而不发出来;然后,由这个 KEY计算出另一个KEY,称之为公匙。这个公钥的特性是几乎不可能通过它自身计算出生成它的私钥。接下来通过网络把这个公钥传给甲,甲收到公钥后,利用公钥对信息加密,并把密文通过网络发送到乙,最后乙利用已知的私钥,就对密文进行解码了。以上就是RSA算法的工作流程。
算法实现过程为:
1 随意选择两个大的质数p和q,p不等于q,计算N=pq。
2 根据欧拉函数,不大于N且与N互质的整数个数为(p-1)(q-1)。
3 选择一个整数e与(p-1)(q-1)互质,并且e小于(p-1)(q-1)。
4 用以下这个公式计算d:d× e ≡ 1 (mod (p-1)(q-1))。
5 将p和q的记录销毁。
以上内容中,(N,e)是公钥,(N,d)是私钥。
下面讲解RSA算法的应用。
RSA的公钥和私钥是由KeyPairGenerator生成的,获取KeyPairGenerator的实例后还需要设置其密钥位数。设置密钥位数越高,加密过程越安全,一般使用1024位。如下代码:
[代码]java代码:
1KeyPairGenerator keyPairGen = KeyPairGeneratorgetInstance(RSA);
2// 密钥位数
3keyPairGeninitialize(1024);
公钥和私钥可以通过KeyPairGenerator执行generateKeyPair()后生成密钥对KeyPair,通过KeyPairgetPublic()和KeyPairgetPrivate()来获取。如下代码:
[代码]java代码:
1// 动态生成密钥对,这是当前最耗时的操作,一般要2s以上。
2KeyPair keyPair = keyPairGengenerateKeyPair();
3// 公钥
4PublicKey publicKey = (RSAPublicKey) keyPairgetPublic();
5// 私钥
6PrivateKey privateKey = (RSAPrivateKey) keyPairgetPrivate();
7byte[] publicKeyData = publicKeygetEncoded();
8byte[] privateKeyData = publicKeygetEncoded();
公钥和私钥都有它们自己独特的比特编码,可以通过getEncoded()方法获取,返回类型为byte[]。通过byte[]可以再度将公钥或私钥还原出来。具体代码如下:
[代码]java代码:
01// 通过公钥byte[]将公钥还原,适用于RSA算法
02public static PublicKey getPublicKey(byte[] keyBytes) throws
03NoSuchAlgorithmException,InvalidKeySpecException {
04 X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
05 KeyFactory keyFactory = KeyFactorygetInstance("RSA");
06 PublicKey publicKey = keyFactorygeneratePublic(keySpec);
07 return publicKey;
08}
09// 通过私钥byte[]将公钥还原,适用于RSA算法
10public static PrivateKey getPrivateKey(byte[] keyBytes) throws
11NoSuchAlgorithmException,InvalidKeySpecException {
12 PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
13 KeyFactory keyFactory = KeyFactorygetInstance("RSA");
14 PrivateKey privateKey = keyFactorygeneratePrivate(keySpec);
15 return privateKey;
16}
在上文讲到的RSA算法实现过程中提到(N,e)是公钥,(N,d)是私钥。既然已经获取到了PublicKey和PrivateKey了,那如何取到N、e、d这三个值呢。要取到这三个值,首先要将PublicKey和PrivateKey强制转换成RSAPublicKey和RSAPrivateKey。共同的N值可以通过getModulus()获取。执行RSAPublicKeygetPublicExponent()可以获取到公钥中的e值,执行RSAPrivateKeygetPrivateExponent()可以获取私钥中的d值。这三者返回类型都是BigInteger。代码如下:
[代码]java代码:
01// 打印公钥信息
02public static void printPublicKeyInfo(PublicKey key){
03RSAPublicKey rsaPublicKey = (RSAPublicKey) publicKey;
04Logd(MainActivityTAG, "RSAPublicKey:");
05Logd(MainActivityTAG, "Moduluslength=" +
06rsaPublicKeygetModulus()bitLength());
07Logd(MainActivityTAG, "Modulus=" +
08rsaPublicKeygetModulus()toString());
09Logd(MainActivityTAG, "PublicExponentlength=" +
10rsaPublicKeygetPublicExponent()bitLength());
11Logd(MainActivityTAG, "PublicExponent=" +
12rsaPublicKeygetPublicExponent()toString());
13}
14
15// 打印私钥信息
16public static void printPublicKeyInfo(PrivateKey key){
17RSAPrivateKey rsaPublicKey = (RSAPrivateKey) privateKey;
18Logd(MainActivityTAG, "RSAPrivateKey:");
19Logd(MainActivityTAG, "Moduluslength=" +
20rsaPrivateKeygetModulus()bitLength());
21Logd(MainActivityTAG, "Modulus=" +
22rsaPrivateKeygetModulus()toString());
23Logd(MainActivityTAG, "PublicExponentlength=" +
24rsaPrivateKeygetPrivateExponent()bitLength());
25Logd(MainActivityTAG, "PublicExponent=" +
26rsaPrivateKeygetPrivateExponent()toString());
27}
由于程序中动态生成KeyPair对明文加密后生成的密文是不可测的,所以在实际开发中通常在生成一个KeyPair后将公钥和私钥的N、e、d这三个特征值记录下来,在真实的开发中使用这三个特征值再去将PublicKey和PrivateKey还原出来。还原方法如下:
[代码]java代码:
01// 使用N、e值还原公钥
02public static PublicKey getPublicKey(String modulus, String
03publicExponent)
04 throws NoSuchAlgorithmException, InvalidKeySpecException {
05 BigInteger bigIntModulus = new BigInteger(modulus);
06 BigInteger bigIntPrivateExponent = new BigInteger(publicExponent);
07 RSAPublicKeySpec keySpec = new RSAPublicKeySpec(bigIntModulus,
08bigIntPrivateExponent);
09 KeyFactory keyFactory = KeyFactorygetInstance("RSA");
10 PublicKey publicKey = keyFactorygeneratePublic(keySpec);
11 return publicKey;
12}
13
14// 使用N、d值还原公钥
15public static PrivateKey getPrivateKey(String modulus, String
16privateExponent)
17 throws NoSuchAlgorithmException, InvalidKeySpecException {
18 BigInteger bigIntModulus = new BigInteger(modulus);
19 BigInteger bigIntPrivateExponent = new BigInteger(privateExponent);
20 RSAPrivateKeySpec keySpec = new RSAPrivateKeySpec(bigIntModulus,
21 bigIntPrivateExponent);
22 KeyFactory keyFactory = KeyFactorygetInstance("RSA");
23 PrivateKey privateKey = keyFactorygeneratePrivate(keySpec);
24 return privateKey;
25}
公钥和私钥都具备后,就可以使用加解密的工具类javaxcryptoCipher对明文和密文进行处理了。与所有的引擎类一样,可以通过调用Cipher类中的getInstance(String transformation)静态工厂方法得到Cipher对象。该方法中的参数描述了由指定输入产生输出所进行的操作或操作集合,可以是下列两种形式之一:“algorithm/mode/padding”或“algorithm”。例如下面的例子就是有效的transformation形式:"DES/CBC/PKCS5Padding"或"DES"。如果没有指定模式或填充方式,就使用特定提供者指定的默认模式或默认填充方式。
Cipher的加密和解密方式所调用的方法和过程都一样,只是传参不同的区别。
欢迎分享,转载请注明来源:品搜搜测评网