如何使用 R 的 cyphr 库手动输入密钥

How to enter key manually using R's cyphr library

假设我使用 R 的 cyphr 库创建一个密钥

library("cyphr")

k <- sodium::keygen()
# > k
# [1] af ee af 08 5b 75 42 7b 83 05 67 69 82 66 55 67 ea ee 04 76 90 cb b2 19 49 11 15 ab 53 5f e9 aa

key <- cyphr::key_sodium(k)
key
# > key
# <cyphr_key: sodium>

这似乎工作正常。

现在假设我从不将此密钥存储在任何地方的文件中,而是将其写在一张纸上。当需要解密文件时,我像这样手动输入密钥以尝试重新创建 sodium cyphr 密钥对象:

k <- "af ee af 08 5b 75 42 7b 83 05 67 69 82 66 55 67 ea ee 04 76 90 cb b2 19 49 11 15 ab 53 5f e9 aa"
key <- cyphr::key_sodium(noquote(k))

# Error in file(con, "rb") : cannot open the connection
# In addition: Warning message:
#   In file(con, "rb") :
#   cannot open file 'af ee af 08 5b 75 42 7b 83 05 67 69 82 66 55 67 ea ee 04 76 90 cb b2 19 49 11 15 ab 53 5f e9 aa': No such file or directory

为什么这不起作用?可以吗?

一个选项是将 space 处的字符串拆分为 strsplit,循环遍历 list 值,通过 hexmode 转换为 raw

k <- unname(sapply(strsplit(k1, " ")[[1]], function(x) as.raw(as.hexmode(x))))

-检查

k
#[1] af ee af 08 5b 75 42 7b 83 05 67 69 82 66 55 67 ea ee 04 76 90 cb b2 19 49 11 15 ab 53 5f e9 aa
str(k)
#raw [1:32] af ee af 08 ...

-用作输入

key <- key_sodium(k)
key    
#<cyphr_key: sodium>

为什么 noquote 没有起作用,因为它仍然是 character class 被 noquote 覆盖,而不是 raw

str(noquote(k1))
# 'noquote' chr "af ee af 08 5b 75 42 7b 83 05 67 69 82 66 55 67 ea ee 04 76 90 cb b2 19 49 11 15 ab 53 5f e9 aa"

class(k)
#[1] "raw"
class(noquote(k1))
#[1] "noquote"

我们需要 classraw

数据

k1 <-  "af ee af 08 5b 75 42 7b 83 05 67 69 82 66 55 67 ea ee 04 76 90 cb b2 19 49 11 15 ab 53 5f e9 aa"