R 字段加密解密
library(tidyverse)
library(janitor)
library(hablar)
library(openssl)
library(magrittr)
library(stringi)
# 加密函数
encrypt_column <- function(data, column_names, key) {
for (column_name in column_names) {
data[[column_name]] <- sapply(data[[column_name]], function(x) {
if (is.na(x) || x == "") {
return(NA)
}
tryCatch({
x_utf8 <- stri_encode(as.character(x), "", "UTF-8")
iv <- rand_bytes(16)
encrypted <- aes_cbc_encrypt(charToRaw(x_utf8), key = key, iv = iv)
paste(openssl::base64_encode(iv), openssl::base64_encode(encrypted), sep = ":")
}, error = function(e) {
warning(paste("Error encrypting value:", x, "Error:", e$message))
return(NA)
})
})
}
return(data)
}
# 解密函数
decrypt_column <- function(data, column_names, key) {
for (column_name in column_names) {
data[[column_name]] <- sapply(data[[column_name]], function(x) {
if (is.na(x)) {
return(NA)
}
tryCatch({
parts <- strsplit(x, ":")[[1]]
iv <- openssl::base64_decode(parts[1])
encrypted <- openssl::base64_decode(parts[2])
decrypted <- aes_cbc_decrypt(encrypted, key = key, iv = iv)
clean_text <- rawToChar(decrypted)
clean_text <- stri_encode(clean_text, "", "UTF-8")
if (stri_isempty(clean_text)) NA else clean_text
}, error = function(e) {
warning(paste("Error decrypting value:", x, "Error:", e$message))
return(NA)
})
})
}
return(data)
}
# 将字符串密钥转换为原始字节类型
key_string <- "12345678901234567890123456789012" # 确保密钥长度为32字节
key <- charToRaw(key_string)
df <- readxl::read_excel('/mnt/c/Users/xuefliang/Downloads/主动监测数据clean/主动监测数据clean/tmp_xxbjs_20250929.xlsx')
df_encrypted <- encrypt_column(df, c('病例身份证号','病例姓名','病例常住地址','病例联系方式'), key)
df_encrypted |>
writexl::write_xlsx('/mnt/c/Users/xuefliang/Downloads/主动监测数据clean/主动监测数据clean/xxbjs_20250929_encrypted.xlsx')
df_decrypted <- decrypt_column(df_encrypted,c('病例身份证号','病例姓名','病例常住地址','病例联系方式'),key)
评论
发表评论