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)

评论

此博客中的热门博文

V2ray websocket(ws)+tls+nginx分流

Rstudio 使用代理