Reprezentation of large numbers in cryptographical application


I would like to ask you, how I should work with large numbers. I need to generate number bigger than 2^160 a work with it bit by bit and then hash it. I searched for some information but I’ve found only main data types and data structures. Is there any structure or data type to represent such a large number and work with it?


BigInt is probably what you need:


I’m trying to create number 2^160 using:

BigInt(2^160) => result 0

but I’m still limited by size of Int -> 2^64 = 0, so I got result 0 for BigInt also. Everything alse works fine, I can sum or multiply number which cross that 2^64 border.

BigInt(2^62) ^ 2 => works
BigInt(2^124) => does not work

Did I miss anything?


The problem with this is, that 2^160 would have to be an Int before it is converted to a BigInt (which obviously does not work). So you can e.g. write big(2)^big(160)


Please note that BigInt is in general not appropriate for production cryptographic implementations because the operations on it are not constant time, so you need to make sure not to expose side timing side channels.


Is it only matter of time why it is not suitable? I’m working on elliptic curve generation according to this article:
Then I’m gonna test a few algorithms to solve ECDLP, so I think that this issue is not connected to my work.


It’s just fine for doing cryptography research, all I wanted to point out is that writing secure implementations of real-world cryptographic protocols is more difficult than getting the math right, and BigInt is not suitable for that purpose.