3 ms·
This isn't a particularly good way to learn RSA, and Javascript isn't a good environment to teach it. It's better to use Python, which at least has bignums. A
by less_less 3y ago
This isn't a particularly good way to learn RSA, and Javascript isn't a good environment to teach it. It's better to use Python, which at least has bignums. And obviously, seeing a wrong implementation of RSA isn't at all essential for implementing secure systems, contrary to the article's claims. Few people will actually need to implement RSA, and for those people, all those details that the article gets wrong really matter.
The code here doesn't even work, partly because it calls euclideanAlgorithm when the author means extendedEuclidean, but also because Javascript only has 53-bit integers and the modular-multiplication code uses [edit] 60-bit intermediates when N is 30 bits long.
- f_devd 3y agoJavascript has native BigInts, and there is already an RSA implementation using them: https://github.com/i404788/tiny-rsa https://github.com/i404788/tiny-rsa
- pquki4 3y agoThat's funny -- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt#cryptography https://developer.mozilla.org/en-US/docs/Web/JavaScript/Refe... > The operations supported on BigInt values are not constant-time and are thus open to timing attacks. JavaScript BigInts therefore could be dangerous for use in cryptography without mitigating factors. Without checking the source code to understand their exact implementation, it seems questionable to implement cryptography algorithms for serious use in JavaScript.
- hajile 3y agoAn implementation using TypedArray should be in constant time.
- silvestrov 3y agoAll common browsers support BigInt in Javascript: https://caniuse.com/?search=BigInt https://caniuse.com/?search=BigInt
- duckman1 3y agoThe article seems to be generated by GPT. Its quality is remarkably low.
- dvh 3y agoBrowsers have native bignum support: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt https://developer.mozilla.org/en-US/docs/Web/JavaScript/Refe...
- hajile 3y agoJS not only has BigInt, but it also has TypedArrays too. It even used to have SIMD support before they dropped it for WASM.
- a2800276 3y agoNot sure why all these responses point out that BigInt is supported in Javascript these days. The fact remains that the code in the article doesn't use BigInt and 'numbers' aren't automatically promoted.
- hajile 3y agoI was primarily addressing > It's better to use Python, which at least has bignums.
- tyingq 3y agoI see the peer comments regarding big ints, but the OP is still right in that the presented code doesn't work, for more than one reason.
- shiomiru 3y agoBesides, the code does not use BigInts at all, so the fact that JavaScript has them does not help much. I agree with the sibling commenter that this seems to be automatically generated. The disclaimer is weird, you don't just use a random rsa implementation found in a blog post "with careful consideration and expert guidance". The article's structure is weird, it's just a bullet list of steps and then code dump. It gets many details wrong (code won't run, explanation seems to be mixing up euler & carmichael totients, ...). etc. It is somewhat scary that this got to the front page at all.
- throwayaw84330 3y ago100% agree. Many red flags here: - Look at the text below the headers "Explaining RSA Cryptography" and "Explaining RSA Cryptography with JavaScript". Both paragraphs start with the exact same text. I believe there are far more chances that this was generated by a machine rather than a human. - Look at the math! There is a code block where it says "scssCopy" -- the "Copy" is generally garbage from machine generated text+code snippets. - The code has a missing function, `lcm`. Author has forgotten to include it, which can be a human or machine error. This kind of episode makes me wonder if I should continue posting, suggest that people filter everything through an LLM, or just resign to the botspamcallypse.
- thraxil 3y agoYeah, the implementation here obviously has problems, but as a learning exercise, I do still think it's worth implementing RSA (or anything else complex) in whatever language you're comfortable with. Personally, I implemented RSA in JavaScript back in 1998 as an exercise. I had to roll my own basic BigNum implementation and it didn't perform well enough to handle non-trivial key or message sizes, but I still think it was valuable for my education (and fun).
- tialaramex 3y agoIf it was "valuable for my education" what did you learn? Your take away seems to have been that your toy RSA implementation "didn't perform well enough" which isn't a lesson.
- thraxil 3y agoI learned... how RSA works... better than I would have just from reading about the algorithm in a book or from a lecture? Why is it a strange concept that one could learn something by doing rather than just reading/listening? The RSA algorithm isn't inherently about bit-twiddling, but to implement it efficiently for real-world use, you have to get into a lot of those weeds that distract you from the core ideas.
- tialaramex 3y agoI'm not at all convinced that "I made this thing which didn't actually work" constitutes learning more than say the colour-mixing video from "Art of the Problem". In both cases you're only learning the concept, and if you actually do this it won't actually work†. So, why do it rather than just reading about it? Usually our argument for learning by doing is that you're gaining valuable experience of it actually working - but textbook RSA doesn't work, it doesn't deliver security. So the best case is the same as just reading about it or watching a video, except it took much longer. The worst case is that you believe what you're doing (a toy which can't work) is how it actually works (which it isn't) and then you try to apply this incorrect lesson. † Specifically, textbook RSA doesn't achieve security, you're missing a crucial component of a working system which wasn't important to the explanation but is crucial to a working system.
- simpaticoder 3y agoHi there! I think JavaScript is a great way to teach, since it's such an accessible language. It also allows you to ship your code to run easily for your users. The OP's code needed a little help; there were some missing functions, misnamed calls, and he didn't use js BigInts (which are built-in to the browser, and you can use them as literals by appending 'n' to a number.) See (and run) the fixed up code here: https://simpatico.io/crypto.md#rsafromscratch https://simpatico.io/crypto.md#rsafromscratch EDIT: for my own crypto needs in the browser I use `subtle.crypto` with ECDH - https://en.wikipedia.org/wiki/Elliptic-curve_Diffie%E2%80%93Hellman https://en.wikipedia.org/wiki/Elliptic-curve_Diffie%E2%80%93...
- zelphirkalt 3y agoI think many people here object to the statement, that using JS is a good way of teaching, since there are many people here with in-depth knowledge about programming language theory and knowledge about the far too many bad parts of JS. I myself would recommend conceptually richer and yet syntactically simpler languages than JS or Python, with the note, that it depends on what you want to learn. If you want to learn to make a website with dynamic features, sure, learn some JS. If you want to learn computer programming and grasp important concepts well, you are better off learning other languages.
- simpaticoder 3y agoPeople have strong preferences in this area, as to be expected. After all, good programming pedagogy itself is weakened because it is, by nature, partitioned by language (and often further, by framework). I prefer to zoom out and realize that everyone wants all tutorials to be written in their favorite language, and realizing this makes me a little less attached to mine, and more accepting of others, even if they are not for me.
- zelphirkalt 3y agoThis is true, but it is also true, that some concepts cannot be taught well in languages, that do not support them well and will get the wrong message to the learner. Many learn, that recursion is something dangerous for example, because their learning vehicle language has no good implementation for it. Another example is memory allocation. You wouldn't teach that in Python probably. Or a concept like ownership, which would be good to teach in Rust, where the language has that concept explicitly and visibly built into it.