CryptoKit-用公钥加密



为了给您提供上下文,有一个开发人员开发项目的API,json的一部分将被加密。所以我必须解读他的内容。他列出了我在iOs方面需要的所有功能。

所以我有他的javascript代码,我必须用swift重做等效代码。他使用JS库(SJCL(:https://github.com/bitwiseshiftleft/sjcl/

我正试图用公钥加密一些文本,但我做不到。

首先,我生成了私钥/公钥

let keypair = P256.Signing.PrivateKey() // generation of a key pair
let private_key = keypair.rawRepresentation.base64EncodedString()   // private key
print(private_key)
print("------------")
let public_key = keypair.publicKey // public key - DATA
print(public_key)
print("------------")
let publicKeyString = public_key.rawRepresentation.base64EncodedString() // public key - STRING - easy to share
print(publicKeyString)

现在,我正在尝试用公钥加密文本。。

在这里,他的javascript代码:

var c256 = sjcl.ecc.curves.c256;
var publickeyBas64ToBits = sjcl.codec.base64.toBits(publickey);
console.log(c256);
console.log(publickey);
console.log(publickeyBas64ToBits);
var pub = new sjcl.ecc.elGamal.publicKey(
c256, 
publickeyBas64ToBits
)
var ciphertext = sjcl.encrypt(pub, message)
return ciphertext

我不明白如何用CryptoKit在swift中做同样的事情:/

你能帮我吗?:(

给定两个密钥对,让我们称它们为Alice和Bob-Alice希望加密只有Bob才能解密的消息M(以及Alice(:

您得到的Bobs公钥是33或64,或者可能是65个字节(压缩形式,X||Y形式(原始(或未压缩的04||X||Y(,从这些字节构造P256.KeyAgreement.PublicKey。这假设字节不是base64编码的,而是十六进制格式(有关十六进制字符串到数据的转换,请参阅:https://gist.github.com/nicklockwood/81b9f122f3db9e7132be7bd61d0c0cea(。如果是Base64而不是十六进制,请先对其进行解码,并确保33、64或65个字节。如果是65个字节,则删除第一个字节并使用此初始化器。如果是33个字节,请使用此初始化程序而不是

访问Alice私钥P256.KeyAgreement.PrivateKey-如果您之前创建了一个签名私钥(P256.Signing.PrivateKey(,您可以简单地使用属性rawRepresentation和两者上的初始值设定项init(rawRepresentation在它们之间来回转换-执行密钥协议以形成SharedSecret。通过调用

let sharedSecret = aliceKeyAgreementPrivateKey.sharedSecretFromKeyAgreement(with: bobsKeyAgreementPublicKey)

现在让我们创建一个AES。GCM。来自消息字节的Sealed Box

let encryptedMessage = try AES.GCM.SealedBox(combined: messageData)其中messageData是来自base64解码base64编码字符串的Data或来自十六进制字符串的Data。

现在让我们创建一个可以用于AES的SymmetricKey。GCM解密-"打开"-密封的盒子。

let aesDecryptionKey = sharedSecret.withUnsafeBytes { SymmetricKey($0) }或者用这个方法代替withUnsafeBytes或这个方法,但你需要想出一个好的盐。与UnsafeBytes相比,这些方法要安全得多,但会使我的解释变得更长、更复杂,所以我将其留给您的系统来确定salt。当然,它必须与发件人用来加密消息的内容相匹配!!在SharedSecret by KeyAgreement和用于加密/解密的SymmetricKey的派生中都必须匹配。。

终于可以打开密封盒了!

let decryptedData = try AES.GCM.open(sealedBox, using: aesDecryptionKey)

如果数据是一些明文消息,你可能想对其进行解码,使其可读,例如,如果它是UTF8编码的:

let decryptedMessage = String(data: decryptedData, encoding: .utf8)!

相关内容

  • 没有找到相关文章

最新更新