为了给您提供上下文,有一个开发人员开发项目的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)!