【问题标题】:How do I read an encrypted file from disk with R如何使用 R 从磁盘读取加密文件
【发布时间】:2014-10-08 17:44:48
【问题描述】:

我有一个敏感数据集,不应该以未加密的方式存储在磁盘上。 R 可以处理这个问题还是我唯一的选择是全盘加密?

【问题讨论】:

  • 它是如何加密的??查看PKI package in R
  • @jlhoward 它可以以任何最适合 R 的方式加密。感谢您的包参考。
  • system 函数或在 Windows 上的 shell 函数可用于将命令传递给具有 API 的实用程序。
  • 我遇到了这个名为 encryptr 的包,它有助于加密、解密和加载数据。文档位于:encrypt-r.org

标签: r encryption privacy


【解决方案1】:

我觉得有一种更简单的方法可以做到这一点,但是进行 AES 加密的 digest 包是我遇到的最接近您要求的东西。这应该可以帮助您入门。

# 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 格式的文本字符串,将其转换为 raw(AES 需要),将原始向量填充为 16 字节的倍数(AES 也需要),加密并写入一个二进制文件。 read.aes(...) 基本上颠倒了这个过程。

这只是一个示例,旨在根据您的需要进行修改。例如,这会保存没有行名的数据框,这可能是也可能不是问题。

【讨论】:

  • 感谢这个优秀的代码!您可以使用dputdget 而不是write.csvread.csv 以文本格式存储任意R 对象,然后再将它们转换为二进制格式。
  • 感谢您提供的好例子!那么我是否理解正确,我必须将密钥保存在代码之外的其他地方?因为如果我将它保存在代码中,它就不再安全了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-14
  • 2018-02-25
  • 2023-03-13
相关资源
最近更新 更多