dongtun4268 2019-01-17 09:46
浏览 144
已采纳

在Go中解密非ASCII装甲的PGP文件

Is it possible to decrypt binary .PGP file with Go's "golang.org/x/crypto/openpgp" library?

The following code works with an armored ASCII encoded file but throws EOF error with a binary PGP file. Is there a similar function to armor.Decode() that allows for the binary file to be decrypted?

func DecryptFile(encryptedFilePath string, decryptedFilePath string) error {
pubKey := decodePublicKey()
privKey := decodePrivateKey()

entity := createEntityFromKeys(pubKey, privKey)

file := readFile(encryptedFilePath)

block, err := armor.Decode(file)
if err != nil {
    log.Printf("Error reading OpenPGP Armor: %s", err)
    return err
}

if block.Type != "Message" {
    log.Println("Invalid message type")
    return err
}

var entityList openpgp.EntityList
entityList = append(entityList, entity)

messageDetails, err := openpgp.ReadMessage(block.Body, entityList, nil, nil)
if err != nil {
    log.Printf("Error reading message: %s", err)
    return err
}

compressed, err := gzip.NewReader(messageDetails.UnverifiedBody)
if err != nil {
    log.Printf("Invalid compression level: %s", err)
    return err
}
defer compressed.Close()

buffer := bytes.NewBuffer(nil)

n, err := io.Copy(buffer, compressed)
if err != nil {
    log.Printf("Error reading encrypted file: %s", err)
    return err
}

err = ioutil.WriteFile(decryptedFilePath, buffer.Bytes(), 0644)
if err != nil {
    log.Println(err)
    return err
}

log.Printf("Decrypted %d bytes
", n)

return nil

}

  • 写回答

1条回答 默认 最新

  • drmg17928 2019-07-10 08:18
    关注

    I encountered the same exact problem with PGP, also got EOF on my first trial.

    The encrypted file is in binary(.pgp)

    The private/public key in key ring armored file(.asc) like this:

    ----BEGIN PGP PUBLIC KEY BLOCK-----
    
    -----END PGP PRIVATE KEY BLOCK-----
    

    Here is the code that I use:

    keyRing, err := os.Open("keyArmoredFile.asc")
    if err != nil {
        log.Fatal(err)
    }
    
    entityList, err := openpgp.ReadArmoredKeyRing(keyRing)
    if err != nil {
        log.Fatal(err)
    }
    
    entity := entityList[0]
    passphraseByte := []byte("password")
    err = entity.PrivateKey.Decrypt(passphraseByte)
    if err != nil {
        log.Fatal(err)
    }
    for _, subkey := range entity.Subkeys {
        subkey.PrivateKey.Decrypt(passphraseByte)
    }
    
    encryptedContent, err := os.Open("encryptedFile.pgp")
    if err != nil {
        log.Fatal(err)
    }
    
    md, err := openpgp.ReadMessage(encryptedContent, entityList, nil, nil)
    if err != nil {
        log.Fatal(err)}
    
    bytes, err := ioutil.ReadAll(md.UnverifiedBody)
    if err != nil {
        log.Fatal(err)
    }
    
    // decryption result
    decStr := string(bytes)
    

    Reference: https://gist.github.com/stuart-warren/93750a142d3de4e8fdd2

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么