软件名称:一笔签名设计
昱凡 敏德 文星 烨棋 庆哲 海辉 奕哲 颐宝 益祺 轩峻
廷达 思易 鹏宽 晨熙 康柱 世岚 诗研 颢腾 源豪 搏然
颖抒 含萌 甜予 昔译 香忻 茵媛 哲颢 宣舒 姝怡 艺汐
和苹果打交道,最好是准备一台Mac机。这里需要用到一个苹果自带的KeyAccess的软件,用来生成证书的申请文件。
> 认证中心一般由政府出资建立。每个实体都有CA 发来的证书(certificate),里面有公钥及其拥有者的标识信息。此证书被 CA 进行了数字签名。任何用户都可从可信的地方获得认证中心 CA 的公钥,此公钥用来验证某个公钥是否为某个实体所拥有。有的大公司也提供认证中心服务
一次性口令
电脑软件生成的:陈健均
山叡、博熙、志藏、嘉浩、瑕恒、振智
参考文档 https://zhuanlan.zhihu.com/p/423506052
昊晨、淳嘉、豫志、国锐、一卓、旭颖
琳影 丝琪 初焓 柔谣 雯嘉 茉丹 皙婷 会灵 莉姝 舒潆
数字签名技术: 将摘要信息用发送者的私钥加密,与原文一起传送给接收者。接收者用发送者的公钥解密被加密的摘要信息, 然后用HASH函数对收到的原文产生一个摘要信息 ,与解密的摘要信息对比。如果相同,则说明收到的信息是完整的,在传输过程中没有被修改, 否则说明信息被修改过,因此数字签名能够验证信息的完整性
出处:"世途虽纷华,常思泉下的光景,则利欲之心自淡。"——《菜根谭 应酬》
1. 准备CSR文件
2. 申请证书
3. AppID
4. 注册设备
5. 生成签名文件
5.3 下一步是选择设备,只有选中的设备才能安装应用。当然,如果是AppStore的签名文件则没有这步
5.4 最后,输入签名文件的名字,按下Generate按钮,签名文件就生成了。
接着再"用发送方的公钥" 来对"报文的数字签名进行解密" (解密后的摘要),
易正秋
.crt文件:CA认证后的证书文件,certificate的缩写。
薛小梦
"东风吹花雪满川,紫气凝阁朝景妍。"——《全唐诗 金谷园歌》
谢振华
在线生成的:申曜宁
.key文件:私钥文件,通常使用rsa算法,私钥需要自己保存,无需提交给CA机构
一、文字意义需合乎八字
二、五行需与八字结构感应
三、年、月、日、时辰与名字相互对应
梦菲
根据宝宝出生的年、月、日、时,通过计算可以得到生辰八字。具体可以参看什么是生辰八字起名。
Common Name (e.g. server FQDN or YOUR name) []:xxx.com
高懿、高韵、光启、光熙、晗昱、晗日
为随机数生成器
鹏涛、鹏煊、绍晖、文昂、文景、曦哲
墨然设计的:张成善
丛诚、珉如、绚及、容遥、悦北、倩百
高翰、高杰、高峻、高朗、高邈、高旻
专有名词
2 生成服务器端证书签名请求文件(csr文件)
数字签名
泽渲 辰诗 逸灏 靖琦 腾达 文睿 亦珂 心远 彦锋 宝文
微信支付宝 api 接口验签
电脑软件生成的:王青翠
徐振江
徐晓明
芯妍
2 接收方
通常情况,我们部署在内网的服务会采用自签名的证书
这里需要输入设备的UDID,根据账号的类型,可以注册100台或者更多的设备。
签名文件是应用签名的核心文件。签名文件同样也有开发和发布的区分,当然,Adhoc发布和AppStore发布的签名文件也是不同的。
姝怀 雨霞 新凡 夏瑶 曼双 雅善 娇梦 馨萧 箫哲 渲语
晓君、善来、柯泰、卫柯、俊天、享信
1 发送报文时,
- SHA-1、SHA-256、SHA-384、SHA-512 SHA-1是由NIST设计的一种能够产生160比特的散列值的单项散列函数,SHA-1的消息长度存在上限,但这个值接近2^64比特
- SHA-256、SHA-384、SHA-512 SHA-256、SHA-384、SHA-512都是由NIST设计的单向散列函数,他们的散列值长度分别为256比特、384比特、512比特。 这些单向散列函数合起来统称SHA-2,他们的消息长度也存在上限,分别为2^64、2^128、2^128比特
> 我国公开的国产商用密码算法包括SM1、SM2、SM3、SM4、SM7、SM9及祖冲之算法,> 其中SM2、SM3、SM4最为常用,用于对应替代RSA、DES、3DES、SHA等国际通用密码算法体系
private static X9ECParameters x9ECParameters = GMNamedCurves.getByName("sm2p256v1"); private static ECDomainParameters ecDomainParameters = new ECDomainParameters(x9ECParameters.getCurve(), x9ECParameters.getG(), x9ECParameters.getN()); private static ECParameterSpec ecParameterSpec = new ECParameterSpec(x9ECParameters.getCurve(), x9ECParameters.getG(), x9ECParameters.getN()); static { if (Security.getProvider("BC") == null) { Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); } } public static void main(String[] args) { //生成密钥对 KeyPair kp = generateKeyPair(); //获取公钥 PublicKey publicKey = kp.getPublic(); //获取私钥 PrivateKey privateKey = kp.getPrivate(); //明文 String text = "SM2 Demo"; byte[] encrypt = encrypt(text.getBytes(), publicKey, "C1C3C2"); System.out.println(Base64.encodeBase64String(encrypt)); encrypt = decrypt(encrypt, privateKey, "C1C3C2"); System.out.println(new String(encrypt)); } private static KeyPair generateKeyPair() { try { //根据算法名称 创建KeyPairGenerator对象 ;该对象为指定算法生成公钥/私钥对 // getInstance(String algorithm, String provider) / KeyPairGenerator kpGen = KeyPairGenerator.getInstance("EC", "BC"); kpGen.initialize(ecParameterSpec, new SecureRandom()); return kpGen.generateKeyPair(); } catch (Exception e) { throw new RuntimeException("算法不存在",e); } } private static byte[] encrypt(byte[] data, PublicKey key, String standard) { if ("C1C2C3".equals(standard)) { return encryptNew(encryptOld(data, key)); } return encryptOld(data, key); } private static byte[] decrypt(byte[] data, PrivateKey key, String standard) { if ("C1C2C3".equals(standard)) { return decryptOld(decryptNew(data), key); } return decryptOld(data, key); } private static byte[] encryptOld(byte[] data, PublicKey key) { BCECPublicKey bcecPublicKey = (BCECPublicKey) key; ECPublicKeyParameters ecPublicKeyParameters = new ECPublicKeyParameters(bcecPublicKey.getQ(), ecDomainParameters); SM2Engine sm2Engine = new SM2Engine(); sm2Engine.init(true, new ParametersWithRandom(ecPublicKeyParameters, new SecureRandom())); try { return sm2Engine.processBlock(data, 0, data.length); } catch (InvalidCipherTextException e) { throw new RuntimeException(e); } } private static byte[] encryptNew(byte[] c1c2c3) { final int c1Len = (x9ECParameters.getCurve().getFieldSize() + 7) / 8 * 2 + 1; final int c3Len = 32; byte[] result = new byte[c1c2c3.length]; System.arraycopy(c1c2c3, 0, result, 0, c1Len); System.arraycopy(c1c2c3, c1c2c3.length - c3Len, result, c1Len, c3Len); System.arraycopy(c1c2c3, c1Len, result, c1Len + c3Len, c1c2c3.length - c1Len - c3Len); return result; } private static byte[] decryptOld(byte[] data, PrivateKey key) { BCECPrivateKey bcecPrivateKey = (BCECPrivateKey) key; ECPrivateKeyParameters ecPrivateKeyParameters = new ECPrivateKeyParameters(bcecPrivateKey.getD(), ecDomainParameters); SM2Engine sm2Engine = new SM2Engine(); sm2Engine.init(false, ecPrivateKeyParameters); try { return sm2Engine.processBlock(data, 0, data.length); } catch (InvalidCipherTextException e) { throw new RuntimeException(e); } } private static byte[] decryptNew(byte[] c1c3c2) { final int c1Len = (x9ECParameters.getCurve().getFieldSize() + 7) / 8 * 2 + 1; final int c3Len = 32; byte[] result = new byte[c1c3c2.length]; System.arraycopy(c1c3c2, 0, result, 0, c1Len); System.arraycopy(c1c3c2, c1Len + c3Len, result, c1Len, c1c3c2.length - c1Len - c3Len); System.arraycopy(c1c3c2, c1Len, result, c1c3c2.length - c3Len, c3Len); return result; }