当前位置: 首页 > news >正文

网站建设行规在线编程的网站

网站建设行规,在线编程的网站,装修设计公司加盟,营销型网站商城移动端 [Android iOS] 压缩 ECDSA PublicKey AndroidiOS 使用 Android KeyStore 和 iOS 的 Secure Enclave 提供的安全能力使用 P-256 来对 API 请求进行签名#xff0c;服务器端再进行验证。 但是发现不论是 iOS 还是安卓都没有提供一个便捷的方式从 iOS 的SecKeyCopyE… 移动端 [Android iOS] 压缩 ECDSA PublicKey AndroidiOS 使用 Android KeyStore 和 iOS 的 Secure Enclave 提供的安全能力使用 P-256 来对 API 请求进行签名服务器端再进行验证。 但是发现不论是 iOS 还是安卓都没有提供一个便捷的方式从 iOS 的SecKeyCopyExternalRepresentation(SecKeyCopyPublicKey) 和 Android 的 KeyPair 中得到 33-bytes 的 compressed public key。 压缩公钥Compressed Public Key是一种公钥编码方式可以将 ECC椭圆曲线密码学公钥从 64 个字节压缩为 33 个字节。这种编码方式由一个字节的标识符和32个字节的公钥坐标的一部分y坐标组成从而实现了公钥的压缩。在使用压缩公钥时可以减少传输的数据量和存储空间同时保持相同的安全性和加密效果。压缩公钥广泛应用于比特币、以太坊等区块链领域中。 compressed_public_key y is even?0x02:0x03 x Android private fun secp256r1JKeyPair(packageManager: PackageManager,alias: String,throwIfNotExists: Boolean false, ): KeyPair {val ks: KeyStore KeyStore.getInstance(storeProvider).apply { load(null) }val keyPair: KeyPair if (ks.containsAlias(alias)) {val entry ks.getEntry(alias, null)if (entry !is KeyStore.PrivateKeyEntry) {throw TypeCastException()}KeyPair(entry.certificate.publicKey, entry.privateKey)} else if (throwIfNotExists) {throw KeyStoreException(No key was found with the alias $alias.)} else {val kpg: KeyPairGenerator KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_EC, storeProvider)var properties KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT or KeyProperties.PURPOSE_SIGN or KeyProperties.PURPOSE_VERIFYval parameterSpec KeyGenParameterSpec.Builder(alias, properties).apply {setAlgorithmParameterSpec(ECGenParameterSpec(secp256r1))setDigests(KeyProperties.DIGEST_SHA256)if (Build.VERSION.SDK_INT Build.VERSION_CODES.P hasStrongBox(packageManager)) {setIsStrongBoxBacked(true)}}.build()kpg.initialize(parameterSpec)kpg.generateKeyPair()}return keyPair }OptIn(ExperimentalUnsignedTypes::class) fun bnUByteArrayToUByteArray(bnUByteArray: UByteArray, expectLength: Int): UByteArray {if (bnUByteArray.size expectLength 1) {return bnUByteArray.sliceArray(1..expectLength)}if (bnUByteArray.size expectLength) {return UByteArray(expectLength - bnUByteArray.size) { UByte.MIN_VALUE } bnUByteArray}return bnUByteArray }OptIn(ExperimentalUnsignedTypes::class) fun secp256r1PublicKey(packageManager: PackageManager,alias: String ): UByteArray {val kp secp256r1JKeyPair(packageManager, alias)val publicKey kp.public as ECPublicKey;val point publicKey.wval x: BigInteger point.affineXval y: BigInteger point.affineYval xBytes: UByteArray bnUByteArrayToUByteArray(x.toByteArray().toUByteArray(), 32)val yFLag UByteArray(1)yFLag[0] (if (y.testBit(0)) 0x03 else 0x02).toUByte()return yFLag xBytes }OptIn(ExperimentalUnsignedTypes::class) fun secp256r1Sign(packageManager: PackageManager,alias: String,payload: ByteArray ): UByteArray {val privateKey secp256r1JKeyPair(packageManager, alias).privateval signature Signature.getInstance(signatureAlgorithm).run {initSign(privateKey)update(payload)sign()}val seq DERSequence.fromByteArray(signature) as DLSequenceval r bnUByteArrayToUByteArray((seq.getObjectAt(0) as ASN1Integer).value.toByteArray().toUByteArray(), 32)val s bnUByteArrayToUByteArray((seq.getObjectAt(1) as ASN1Integer).value.toByteArray().toUByteArray(), 32)return r s }OptIn(ExperimentalUnsignedTypes::class) private fun byteArrayToHexString(byteArray: UByteArray): String {return byteArray.joinToString(separator ) { it.toString(16).padStart(2, 0) } }iOS static func secp256r1Key(name: String, requiresBiometry: Bool false) throws - SecKey {let flags: SecAccessControlCreateFlags requiresBiometry ? [.privateKeyUsage, .userPresence] : .privateKeyUsagelet access SecAccessControlCreateWithFlags(kCFAllocatorDefault,kSecAttrAccessibleWhenUnlockedThisDeviceOnly,flags,nil)!let tag name.data(using: .utf8)!let attributes: [String: Any] [kSecAttrKeyType as String : kSecAttrKeyTypeEC,kSecAttrKeySizeInBits as String : 256,kSecAttrTokenID as String : kSecAttrTokenIDSecureEnclave,kSecPrivateKeyAttrs as String : [kSecAttrIsPermanent as String : true,kSecAttrApplicationTag as String : tag,kSecAttrAccessControl as String : access] as [String : Any]]var error: UnmanagedCFError?guard let privateKey SecKeyCreateRandomKey(attributes as CFDictionary, error) else {throw error!.takeRetainedValue()}return privateKey }static func getCompressedPublicKey(key: SecKey) throws - Data {guard let publicKeyData SecKeyCopyExternalRepresentation(SecKeyCopyPublicKey(key)!, nil) as? Data else {throw NSError()}let x publicKeyData.dropFirst().prefix(32)let y publicKeyData.subdata(in: Range(33...64))return Data([0x02 | (y.last! 0x01)]) x }static func secp256r1Sign(name: String, payload: Data) - Data {let key secp256r1Key(name: name)var error: UnmanagedCFError?let asn1signature SecKeyCreateSignature(key!, .ecdsaSignatureMessageX962SHA256, payload as CFData, error)! as Datalet signature try! ECSignature(asn1: asn1signature)return signature.r signature.s }
http://www.hkea.cn/news/14458812/

相关文章:

  • 网站服务器租用一般费用类似wordpress的图片上传
  • 徐州学习网站建设免费制作模卡app的软件
  • 临沂网站建设方案书not found的网站
  • 沈阳网站推广公司排名跟有流量的网站做友情链接
  • 怎么用flash做视频网站微信公众号网页制作教程
  • 渭南做网站的公司电话国内哪个应用商店app最全
  • 深圳龙华的学校网站建设甘肃最新消息今天
  • 济南建站网站网站技术策划
  • windows2008 iis 网站优化网站除了百度站长
  • 做响应式网站哪家好网站维护是什么意思
  • 金湖做网站网站备案怎么更改吗
  • 品牌网站建设 2蝌蚪小河南网络营销哪家便宜
  • 搭建一个网站多少钱哈尔滨电脑南沙区网站建设
  • 做花型设计哪个网站下载素材好wordpress 主页不显示图片
  • 网站开发技术方法与路线巢湖网站制作
  • 外贸电商网站模板深圳龙岗区坂田街道
  • 哈尔滨建设网站的免费咨询网页设计个人博客
  • 建设一个电商网站需要多少钱seo外链网站源码
  • 在电脑新建网站站点营销型网站的例子
  • 免费网站404免费进入网站内容维护有哪些方面
  • 长春网长春网站建设络推广wordpress栏目页打不开
  • 校园论坛网站建设论文苏宁网站优化与推广
  • 盘锦建设工程信息网站贵金属交易平台app最新排名
  • 做网站广告推广平台网站推广应该怎么做
  • wordpress付费插件网站帝国cms网站建设
  • 免费授权企业网站源码wordpress 企业官网
  • 自己做网站兼职有免费的网站做农家院宣传
  • 手机版做网站寺院网站建设
  • 东莞专业做淘宝网站推广婚庆公司收费标准价目一览表
  • 建站的目的php制作网站后台