Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

What is the algorithm used? #1

Closed
calendarbase opened this issue Jan 26, 2018 · 5 comments
Closed

What is the algorithm used? #1

calendarbase opened this issue Jan 26, 2018 · 5 comments

Comments

@calendarbase
Copy link

calendarbase commented Jan 26, 2018

Hi, great package, but what is the crypto algorithm used and how do you select one specific algorithm to use. I am planning to first encrypt a json object in Nodejs and then decrypt it in R. But then I need to know which algorithm I use AES, DES, Bcrypt etc.. Or is it curve25519?

I am trying to encrypt in nodejs and then decrypt it in R with symetric encryption.

@talegari
Copy link
Owner

safer uses sodium, for low level bindings of libsodium. From what I can gather from lisodium's documentation, both symmetric and asymmetric key encryption use XSalsa20 stream cipher (see algorithm details). Asymmetric case use other algorithms for authentication and key-exchange.

safer's decrypt_* functions are specifically meant to be used to decrypt things encrypted by encrypt_*. One needs to carefully look at whether R's charToRaw and rawToChar are working consistently with the encoding standards when reading the encrypted json object.

Sodium's bindings for nodejs. Hope this helps.

@calendarbase
Copy link
Author

calendarbase commented Jan 29, 2018

I checked node-sodium but symmetric encryption is missing. Then I looked at sodium-native and it is a bit to low levell when you just starting with crypto and I can't find symmetric encryption. But I think it´s crypto_stream(cipher, nonce, key) that is the symmetric version.

For example which low level function will match your encrypt_string(string, key)?

JSNacl looks promising https://github.com/tonyg/js-nacl. I have found this symmetric function, but they use nonce:

k = ...;
m = nacl.encode_utf8("message");
n = nacl.crypto_stream_random_nonce();
c = nacl.crypto_stream_xor(m, n, k);
m1 = nacl.crypto_stream_xor(c, n, k);
"message" === nacl.decode_utf8(m1); // always true

I am a little bit suspicious that xor will use another algorithm than XSalsa20.

How do I add a nonce in your solution? Maybe it´s not important if nonce is added behind the sceen.

So far I have managed to do a simple hashing of a string in nodejs. Then I hash it in R and compare it.

@talegari
Copy link
Owner

For the nounce part:

This nounce is used all though by safer.

d9, 29, f8, de, 09, 1e, 48, f9, a1, 98, 5f, a7, 07, 86, 84, 31, d0, 63, 95, 2e, c5, 08, 6f, bc

( essentially the hash of the string 'nounce' )
Do encrypt using this nounce and then try decryping using safer::decrypt_string


About the function matching encrypt_string: safer::encrypt_string calls sodium::data_encrypt which in turn seems to call crypto_secretbox_easy.

Hope this helps.

@calendarbase
Copy link
Author

Ok I managed to encrypt in nodejs and then decrypt it in R. But I did not managed to use safer because I could not convert the nodejs hex strings to R strings (whatever this is). Instead I managed to convert the hex strings to raw vectors and then use R sodium.

Thanks for the support anyhow!

@talegari
Copy link
Owner

talegari commented Feb 4, 2018

Use functions rawToChar and charToRaw to convert between raw and character vectors in R. For your problem, it might be better suited to 'sodium' package directly than using 'safer'.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants