使用这个公钥是否能解密此加密信息?

查看 57|回复 2
作者:FaiChou   
使用私钥 rsa 加密内容:
gl9E9ye5acVdn5MusJj0pay6y+i6qDna8DTSNHkkPjBsEE9DJ34cKhrCiNuRWIxY4+DQmrrQPMzibgCvP+3unWelxwmzMRzmSQQDTm9Z+oBiHGCcqWXtz47H/b1uoC4T6ZXkTrtuYAOVlRDn+2xKPcO9qpq5gS+cU6SPSRcRP/cAthqnLQ0FJJjY2vOqsoKda5IStxLjRSJPXs5zmJFVH/ii7J/u1vp8R6sUUNLhJmahFlODgOoEPDTW50k6O5LS8MYniZLvI/Czj9bt1z850rXGl3wHvfwmhIWH8umR5NqaPJ8/kDJXGk5ejHoljRN2GJ4iL48hvJawsoCNHpktrlqRtE6geQF74gB5hLzSvY2ZUcRo1fx7DxpPnRqfx7ctf6m7nC0vohax4NvdYJ7TWnK+oDGCJFFJRNg+L/DJlcckjWmL3nGoFYgHSfVwZXfTLOcKOtx8Pvd2Udjx+9t2/T4DqJNmhVzBvX/tEqBlv+deAbk8DaGx4FcBWm1b5j2qMUqA33OVIYLOzgFFzdMF8OqEvAPwqyg1pHjt9iPzWXWVjzFA2Z1yVou2TwZ6Z9QqrjaGyK6KfpT+h241FgCVrZgbg8g/JWU7wFHQjiEjJTSTZu6FeweQpRUuUy/A8LS0Wabh0eZQ0hcPcRBwf2gGOlmbfCojrfZNHbjRkh0Rz6YAq3T5q5VdfsKXBUMJcTilfUGRzIivVAFmM5Lx5WzgV7LsPSIuEq5sNFEypk5rrKplTirq3qE6maI3+KKbUccAs2ak6zGLtfFnJasXivwYPrivUnTDz9cV1dVFYKe72/aGnNby2TxWvNpbDu60T8BlX1CFwFj+JQyDqFu+EvgBTQ==
对应的公钥:
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCGhpgMD1okxLnUMCDNLCJwP/P0
UHVlKQWLHPiPCbhgITZHcZim4mgxSWWb0SLDNZL9ta1HlErR6k02xrFyqtYzjDu2
rGInUC0BCZOsln0a7wDwyOA43i5NO8LsNory6fEKbx7aT3Ji8TZCDAfDMbhxvxOf
dPMBDjxP5X3zr7cWgwIDAQAB
-----END PUBLIC KEY-----
如果解密出的结果像是下面这样,应该是对的:
{"2658844581501957149":{"file_name":"wwdc2023-10117_hd.mp4","file_size":"100597894","pick_code":"b12x4iiejvkkq83a","url":{"url":"http:\/\/xxx.xxx.com\/xxx\/wwdc2023-10117_hd.mp4?t=1690607362&u=101248331&s=1048576&d=658578066-b12x4iiejvkkq83a-0&c=2&f=1&k=ddb3d920081771b2f40ee75164c5bb1b&us=52428800&uc=10&v=1","client":2,"desc":null,"isp":null,"oss_id":"fhnfile\/xxx","ooid":""}}}
注意由于加密内容数据比较大,需要分段解密。
不管用什么方法,python/go/java 还是网上的在线解密工具,只要能解密出来即可。
我用 swift 写了分段解密,结果解密失败,用网上在线的解密工具也是失败,不知道网上的工具是不是由于不支持分段解密才失败的。
下面是我用 Swift 写的方法:
import Security
func convertPublicKey(pemString: String) -> SecKey? {
    // 1. Remove headers, newlines and spaces
    let keyString = pemString
        .replacingOccurrences(of: "-----BEGIN PUBLIC KEY-----", with: "")
        .replacingOccurrences(of: "-----END PUBLIC KEY-----", with: "")
        .replacingOccurrences(of: "\n", with: "")
        .replacingOccurrences(of: " ", with: "")
    // 2. Convert base64 string to Data
    guard let keyData = Data(base64Encoded: keyString) else {
        return nil
    }
    // 3. Create key dictionary
    let keyDict: [CFString: Any] = [
        kSecAttrKeyType: kSecAttrKeyTypeRSA,
        kSecAttrKeyClass: kSecAttrKeyClassPublic,
        kSecAttrKeySizeInBits: NSNumber(value: 2048),
        kSecReturnPersistentRef: true
    ]
    // 4. Create SecKey from Data
    var error: Unmanaged?
    guard let key = SecKeyCreateWithData(keyData as CFData, keyDict as CFDictionary, &error) else {
        // Handle the error here
        return nil
    }
    return key
}
let rsaKeyInSwift = convertPublicKey(pemString: rsaPublicKey)
func rsaDecrypt(data: Data) -> Data? {
    let blockSize = SecKeyGetBlockSize(rsaKeyInSwift!)
    var decryptedData = Data()
    for i in stride(from: 0, to: data.count, by: blockSize) {
        let endIndex = min(i + blockSize, data.count)
        let chunk = data[i..?
        guard let decryptedChunk = SecKeyCreateDecryptedData(
            rsaKeyInSwift!,
            .rsaEncryptionPKCS1,
            chunk as CFData,
            &error
        ) else {
            print("Decryption error:", error.debugDescription)
            return nil
        }
        decryptedData.append(decryptedChunk as Data)
    }
    return decryptedData
}
报错:
Decryption error: Optional(Swift.Unmanaged(_value: Error Domain=NSOSStatusErrorDomain Code=-50 "RSAdecrypt wrong input (err -27)" UserInfo={numberOfErrorsDeep=0, NSDescription=RSAdecrypt wrong input (err -27)}))
在网上找到了一个开源的项目,它用 go 语言自己实现了 rsa 解密算法,不清楚为什么它不用标准库来解密。我用标准库实现的( Swift 版本)无法解密。所以不清楚是不是我的代码问题还是其他问题。
下面是 go 语言开源版本:
func rsaDecrypt(input []byte) []byte {
        output := make([]byte, 0)
        cipherSize, blockSize := len(input), rsaServerKey.Size()
        for offset := 0; offset  cipherSize {
                        sliceSize = cipherSize - offset
                }
                n := big.NewInt(0).SetBytes(input[offset : offset+sliceSize])
                m := big.NewInt(0).Exp(n, big.NewInt(int64(rsaServerKey.E)), rsaServerKey.N)
                b := m.Bytes()
                index := bytes.IndexByte(b, '\x00')
                if index
由于不熟悉 go 语言,大概看了下算法,也是计算 (n^e) mod N。
所以请大家用这个公钥解密上面的内容,能否解密出来?

解密, error, offset, Data

zbinlin   
一般都是用公钥来加密的,你怎么想到用它来解密呢?
FaiChou
OP
  
@zbinlin 公钥和私钥在数学上是对等的。反过来也能用。
您需要登录后才可以回帖 登录 | 立即注册

返回顶部