Concrete
WebsiteLibrariesProducts & ServicesDevelopersSupport
2.4
2.4
  • What is Concrete?
  • Getting Started
    • Basics of FHE programs
    • Installation
    • Quick Start
    • Compatibility
    • Exactness
    • Performance
    • Terminology and Structure
  • Tutorials
    • Decorator
    • Progressbar
    • Formatting
    • Tagging
    • Extensions
    • Comparisons
    • Bitwise Operations
    • Table Lookups
    • Rounding
    • Floating Points
    • Multi Precision
    • Multi Parameters
    • Simulation
    • Direct Circuits
    • Statistics
    • Common Workarounds
  • Application Tutorials
    • Key Value Database
    • SHA-256
  • How To
    • Configure
    • Manage Keys
    • Deploy
    • Reuse Arguments
    • Debug
    • Call FHE circuits from other languages
  • Explanations
    • Frontend fusing
    • Compilation
      • Automatic Crypto Parameters choice
      • MLIR FHE Dialects
        • FHELinalg Dialect
        • FHE Dialect
        • TFHE Dialect
        • Concrete Dialect
        • Tracing Dialect
        • Runtime Dialect
        • SDFG Dialect
    • Security curves
  • Developer
    • Contribute
    • Project layout
    • Compiler backend
      • Adding a new backend
Powered by GitBook

Libraries

  • TFHE-rs
  • Concrete
  • Concrete ML
  • fhEVM

Developers

  • Blog
  • Documentation
  • Github
  • FHE resources

Company

  • About
  • Introduction to FHE
  • Media
  • Careers
On this page
  • Usage
  • Example

Was this helpful?

Export as PDF
  1. Explanations

Security curves

PreviousSDFG DialectNextContribute

Last updated 1 year ago

Was this helpful?

To select secure cryptographic parameters for usage in Concrete, we utilize the . In particular, we use the following workflow:

  1. Data Acquisition

    • For a given value of (n,q=264,σ)(n, q = 2^{64}, \sigma)(n,q=264,σ) we obtain raw data from the Lattice Estimator, which ultimately leads to a security level λ\lambdaλ. All relevant attacks in the Lattice Estimator are considered.

    • Increase the value of σ\sigmaσ, until the tuple (n,q=264,σ)(n, q = 2^{64}, \sigma)(n,q=264,σ) satisfies the target level of security λtarget\lambda_{target}λtarget​.

    • Repeat for several values of nnn.

  2. Model Generation for λ=λtarget\lambda = \lambda_{target}λ=λtarget​.

    • At this point, we have several sets of points {(n,q=264,σ)}\{(n, q = 2^{64}, \sigma)\}{(n,q=264,σ)} satisfying the target level of security λtarget\lambda_{target}λtarget​. From here, we fit a model to this raw data (σ\sigmaσ as a function of nnn).

  3. Model Verification.

    • For each model, we perform a verification check to ensure that the values output from the function σ(n)\sigma(n)σ(n) provide the claimed level of security, λtarget\lambda_{target}λtarget​.

These models are then used as input for Concrete, to ensure that the parameter space explored by the compiler attains the required security level. Note that we consider the RC.BDGL16 lattice reduction cost model within the Lattice Estimator. Therefore, when computing our security estimates, we use the call LWE.estimate(params, red_cost_model = RC.BDGL16) on the input parameter set params.

Usage

To generate the raw data from the lattice estimator, use::

make generate-curves

by default, this script will generate parameter curves for {80, 112, 128, 192} bits of security, using log2(q)=64log_2(q) = 64log2​(q)=64.

To compare the current curves with the output of the lattice estimator, use:

make compare-curves

this will compare the four curves generated above against the output of the version of the lattice estimator found in the .

To generate the associated cpp and rust code, use::

make generate-code

further advanced options can be found inside the Makefile.

Example

sage: X = load("128.sobj")

entries are tuples of the form: (n,log2(q),log2(σ),λ)(n, log_2(q), log_2(\sigma), \lambda)(n,log2​(q),log2​(σ),λ). We can view individual entries via::

sage: X["128"][0]
(2366, 64.0, 4.0, 128.51)
sage: curves = load("verified_curves.sobj")

This object is a tuple containing the information required for the four security curves ({80, 112, 128, 192} bits of security). Looking at one of the entries:

sage: curves[2][:3]
(-0.026599462343105267, 2.981543184145991, 128)

Here we can see the linear model parameters (a=−0.026599462343105267,b=2.981543184145991)(a = -0.026599462343105267, b = 2.981543184145991)(a=−0.026599462343105267,b=2.981543184145991) along with the security level 128. This linear model can be used to generate secure parameters in the following way: for q=264q = 2^{64}q=264, if we have an LWE dimension of n=1536n = 1536n=1536, then the required noise size is:

σ=a∗n+b=−37.85\sigma = a * n + b = -37.85σ=a∗n+b=−37.85

This value corresponds to the logarithm of the relative error size. Using the parameter set (n,log(q),σ=264−37.85)(n, log(q), \sigma = 2^{64 - 37.85})(n,log(q),σ=264−37.85) in the Lattice Estimator confirms a 128-bit security level.

To look at the raw data gathered in step 1., we can look in the . These objects can be loaded in the following way using SageMath:

To view the interpolated curves we load the verified_curves.sobj object inside the .

Lattice-Estimator
third_party folder
sage-object folder
sage-object folder