Как читать зашифрованный файл с диска с помощью R

У меня есть чувствительный набор данных, который никогда не должен храниться на незашифрованном диске. Может ли R справиться с этим или является полным шифрованием диска, мой единственный вариант?

Ответ 1

У меня есть ощущение, что есть более простой способ сделать это, но пакет 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

Это использует шифрование AES в режиме ECB. Очевидно, вам нужно использовать один и тот же ключ для шифрования и дешифрования. write.aes(...) преобразует фрейм данных в текстовую строку в формате csv, преобразует ее в необработанную (что требуется для AES), накладывает необработанный вектор на кратное 16 байт (также требуется для AES), шифрует и записывает в двоичный файл. read.aes(...) в основном меняет процесс.

Это просто пример, который должен быть изменен в соответствии с вашими потребностями. Например, это сохраняет кадр данных без имен строк, что может быть или не быть проблемой.