R 语言 |钠|密码 |如何保存和传输 KEY

R language | sodium | cyphr | How to save and transfer a KEY

我正在以本地用户身份加密 csv. 文件,并以远程用户身份解密同一文件,使用 R 语言并借助 sodiumcyphr包。我遇到了满足要求的文档 (https://www.rdocumentation.org/packages/cyphr/versions/1.0.2/topics/key_sodium)。但是,我在保存密钥并将其传输给远程用户时遇到了障碍。

文档中的改编示例 (限制为 string 而不是 csv.:

### Encryption at local user
# Create a new key
key <- cyphr::key_sodium(sodium::keygen())
key
# With this key encrypt a string
secret <- saveRDS(cyphr::encrypt_string("my secret string", key)


# Decryption at remote user:
cyphr::decrypt_string(secret, key)

如何将密钥共享给远程用户进行解密? 虽然我确实尝试将 key 保存到 .rdsfile 格式并将其加载回 R,但密钥不再是 <cyphr_key: sodium> 对象 (使用 saveload 命令)

以下是我尝试以远程用户身份解密时出现的错误:

Error: 'key' must be a cyphr_key

任何关于这方面的指导将不胜感激。

至于如何将密钥传输给远程用户,请参阅此Information Security Stack Exchange post。

错误是因为 saveRDS 不是 return 值。而且您还没有将任何内容保存到文件中,该代码行会出错。加密 保存到文件的正确方法是

key <- cyphr::key_sodium(sodium::keygen())

saveRDS(cyphr::encrypt_string("my secret string", key),
                  file = "test.rds")

secret <- readRDS("test.rds")
secret
# [1] 75 fc bb fd e3 07 66 3e 9b 72 ac ca c7 f5 3a ed 7c d7 e0 b0 ad 3e 53 ba
#[25] e7 dd 14 5e 64 0f 06 51 17 fe e1 f3 aa b9 27 7c 6e 8e 02 55 ae 68 0a 0f
#[49] 89 6c 17 b0 4f 83 3d ea

cyphr::decrypt_string(secret, key)
#[1] "my secret string"

至于将密钥保存到文件的问题,这是一个正常的saveRDS调用,然后是readRDS调用。

看看什么是key。

class(key)
#[1] "cyphr_key"

str(key)
#List of 4
# $ type   : chr "sodium"
# $ key    :function ()  
# $ encrypt:function (msg)  
# $ decrypt:function (msg)  
# - attr(*, "class")= chr "cyphr_key"

现在将其保存到文件 "key.rds",从 .GlobalEnv 中删除对象 key 并从文件中读取它。

saveRDS(key, "key.rds")
rm(key)
key <- readRDS("key.rds")

成功了吗?

class(key)
#[1] "cyphr_key"

str(key)
#List of 4
# $ type   : chr "sodium"
# $ key    :function ()  
# $ encrypt:function (msg)  
# $ decrypt:function (msg)  
# - attr(*, "class")= chr "cyphr_key"

显然是这样,请检查它是否正确解密了字符串。

cyphr::decrypt_string(secret, key)
#[1] "my secret string"

最后清理。

unlink("test.rds")
unlink("key.rds")