如何使用 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"
我们需要 class
为 raw
数据
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"
假设我使用 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"
我们需要 class
为 raw
数据
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"