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

建设微网站网站排名如何稳定

建设微网站,网站排名如何稳定,工业和信息化部电子第五研究所,家教移动端 [Android & iOS] 压缩 ECDSA PublicKey AndroidiOS 使用 Android KeyStore 和 iOS 的 Secure Enclave 提供的安全能力使用 P-256 来对 API 请求进行签名,服务器端再进行验证。 但是发现不论是 iOS 还是安卓都没有提供一个便捷的方式从 iOS 的SecKeyCopyE…

移动端 [Android & iOS] 压缩 ECDSA PublicKey

  • Android
  • iOS

使用 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: Unmanaged<CFError>?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: Unmanaged<CFError>?let asn1signature = SecKeyCreateSignature(key!, .ecdsaSignatureMessageX962SHA256, payload as CFData, &error)! as Datalet signature = try! ECSignature(asn1: asn1signature)return signature.r + signature.s
}
http://www.yayakq.cn/news/538093/

相关文章:

  • asp做网站教程做网站的怎么学
  • 手机网站怎么建品牌软文案例
  • 青岛做公司网站的公司什么是电子商务网站建设与管理
  • 个体网站建设网站建设需要什么样的内容
  • 自助网站制作青浦做网站价格
  • 新乡建设网站公司怎么建设和聚享游一样的网站呢
  • 如何做分类网站信息营销网页设计导航字体大小
  • 学校学院网站建设目标石家庄住房和建设局网站
  • 个人电脑做网站服务器网站做网站办什么营业执照
  • 建大仁科公司网站网站开发为什么要写接口
  • 网站制作 flash 修改设计用哪些网站有哪些功能
  • 仙桃市住房建设局网站怎么做网站免费的教程
  • 大型门户网站建设运营深圳全网营销方案
  • 昌吉住房和城乡建设局网站短视频拍摄剪辑培训班
  • 做一家网站邢台信都区最新通告
  • 石家庄市建设局网站云空间可以做网站
  • dede建设网站视频当背景图片 网站开发
  • 网站设计分析案例教育局门户网站建设目的
  • 资质做网站需要用到什么北京网站备案注销
  • 培训机构的网站建设做网站的前台用什么工具
  • 湘潭县建设投资有限公司网站海曙区做网站
  • 哪个域名注册网站好满18点此转入2o2
  • 外贸网站seo优化济南 制作网站 公司哪家好
  • 站长查询域名室内设计学校比较好
  • 网站做跳转链接的好处建设网站是否应当摊销
  • 全国最大型网站建设了解网站建设
  • 网站 ip修改备案流程图建设银行网站电子支付在哪里
  • 电子政务门户网站建设教训做视频网站如何赚钱
  • 烟台高新区建设局网站二合一子母被的好处
  • 黄页网站推广软件扶沟县建设局网站