R язык | натрий | cyphr | Как сохранить и передать ключ - PullRequest
0 голосов
/ 28 февраля 2020

Я работаю над шифрованием файла csv. как локального пользователя и расшифровываю тот же файл, что и удаленный пользователь, используя язык R с помощью пакетов sodium и cyphr. Я наткнулся на эту документацию, которая удовлетворяет требованию (https://www.rdocumentation.org/packages/cyphr/versions/1.0.2/topics/key_sodium). Однако я сталкиваюсь с камнем преткновения при сохранении и передаче ключа удаленному пользователю.

Адаптированный пример из документации (ограничение string вместо csv.) :

### Encryption at local user
# Create a new key
key <- cyphr::key_sodium(sodium::keygen())
key
# With this key encrypt a string
secret <- saveRDS(cyphr::encrypt_string("my secret string", key)


# Decryption at remote user:
cyphr::decrypt_string(secret, key)

Как я могу поделиться ключом с удаленный пользователь для расшифровки? Хотя я пытался сохранить key в формате .rds или file и загрузить его обратно в R, но ключ больше не является <cyphr_key: sodium> объектом (с использованием команд save и load) .

Ниже приведена ошибка, когда я пытаюсь расшифровать как удаленный пользователь:

Error: 'key' must be a cyphr_key

Любое руководство по этому вопросу будет высоко оценено.

1 Ответ

1 голос
/ 28 февраля 2020

Сведения о том, как передать ключ удаленному пользователю, см. В этом сообщении Стек информационной безопасности .

Ошибка связана с тем, что saveRDS не возвращает значение , И вы ничего не сохранили в файл, эта строка кода выдает ошибку. Правильный способ шифрования и для сохранения в файл:

key <- cyphr::key_sodium(sodium::keygen())

saveRDS(cyphr::encrypt_string("my secret string", key),
                  file = "test.rds")

secret <- readRDS("test.rds")
secret
# [1] 75 fc bb fd e3 07 66 3e 9b 72 ac ca c7 f5 3a ed 7c d7 e0 b0 ad 3e 53 ba
#[25] e7 dd 14 5e 64 0f 06 51 17 fe e1 f3 aa b9 27 7c 6e 8e 02 55 ae 68 0a 0f
#[49] 89 6c 17 b0 4f 83 3d ea

cyphr::decrypt_string(secret, key)
#[1] "my secret string"

Что касается проблемы сохранения ключа в файле, это обычный вызов saveRDS, за которым следует readRDS звонок.

Посмотрите, что такое ключ.

class(key)
#[1] "cyphr_key"

str(key)
#List of 4
# $ type   : chr "sodium"
# $ key    :function ()  
# $ encrypt:function (msg)  
# $ decrypt:function (msg)  
# - attr(*, "class")= chr "cyphr_key"

Теперь сохраните его в файл "key.rds", удалите объект key из .GlobalEnv и прочитайте его из файла.

saveRDS(key, "key.rds")
rm(key)
key <- readRDS("key.rds")

Это сработало?

class(key)
#[1] "cyphr_key"

str(key)
#List of 4
# $ type   : chr "sodium"
# $ key    :function ()  
# $ encrypt:function (msg)  
# $ decrypt:function (msg)  
# - attr(*, "class")= chr "cyphr_key"

По-видимому, так и было, проверьте, правильно ли оно расшифровывает строку.

cyphr::decrypt_string(secret, key)
#[1] "my secret string"

Окончательная очистка.

unlink("test.rds")
unlink("key.rds")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...