如何使用R从磁盘读取加密文件

13

我有一个敏感的数据集,不应该明文存储在磁盘上。 R能够处理这个问题吗?还是全盘加密是我的唯一选择?


2
它是如何加密的?请查看R中的PKI - jlhoward
@jlhoward 可以使用最适合 R 的任何加密方式进行加密。感谢您提供的软件包参考。 - orizon
system 函数,或者在 Windows 上使用的 shell 函数可以用来向具有 API 的实用程序传递命令。 - IRTFM
我发现了一个叫做encryptr的软件包,它可以帮助加密、解密和加载数据。文档可在以下网址找到:https://encrypt-r.org/ - matrixloading
1个回答

16

我感觉有一种更简单的方法来做这件事,但是digest软件包可以进行AES加密,这是我找到的最接近你所要求的东西。这应该能帮助你入门。

# write encrypted data frame to file
write.aes <- function(df,filename, key) {
  require(digest)
  zz <- textConnection("out","w")
  write.csv(df,zz, row.names=F)
  close(zz)
  out <- paste(out,collapse="\n")
  raw <- charToRaw(out)
  raw <- c(raw,as.raw(rep(0,16-length(raw)%%16)))
  aes <- AES(key,mode="ECB")
  aes$encrypt(raw)
  writeBin(aes$encrypt(raw),filename)  
}
# read encypted data frame from file
read.aes <- function(filename,key) {
  require(digest)
  dat <- readBin(filename,"raw",n=1000)
  aes <- AES(key,mode="ECB")
  raw <- aes$decrypt(dat, raw=TRUE)
  txt <- rawToChar(raw[raw>0])
  read.csv(text=txt)
}   
# sample data
set.seed(1)     # for reproducible example
data <- data.frame(x=rnorm(10),y=rpois(10,1),
                   z=letters[1:10],w=sample(T:F,10,replace=T))    

set.seed(123581321)
key <- as.raw(sample(1:32,32))
write.aes(data,"encrypted.dat",key)
result <- read.aes("encrypted.dat",key)  
# did it work?
all.equal(data,result)
# [1] TRUE

这里使用ECB模式的AES加密。显然,您需要使用相同的密钥来进行加密和解密。write.aes(...)将数据帧转换为csv格式的文本字符串,将其转换为原始值(这是AES所需的),将原始向量填充到16个字节的倍数(这也是AES所需的),加密并写入二进制文件。 read.aes(...)基本上是反向的过程。
这只是一个示例,旨在根据您的需要进行修改。例如,此处保存了没有行名称的数据框,这可能是一个问题或不是一个问题。

2
感谢您提供这个优秀的代码!在将R对象转换为二进制格式之前,您可以使用dputdget而不是write.csvread.csv来以文本格式存储任意R对象。 - cryo111
谢谢你提供的很好的例子!所以,我理解得对吗?我必须将密钥保存在代码之外的某个地方吗?因为如果我把它保存在代码中,那就不再安全了。 - schluk5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接