{"id":22664989,"url":"https://github.com/marcode24/criptografia-rsa","last_synced_at":"2026-04-11T02:49:13.603Z","repository":{"id":212400564,"uuid":"724409342","full_name":"marcode24/criptografia-rsa","owner":"marcode24","description":"🔐 This is a cryptography project testing, using RSA criptography","archived":false,"fork":false,"pushed_at":"2023-12-14T05:26:05.000Z","size":76,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-07-22T10:51:00.540Z","etag":null,"topics":["cryptography","css","html","html-css-javascript","html5-css3","javascript","multer","nodejs","rsa","rsa-cryptography"],"latest_commit_sha":null,"homepage":"https://criptografia-rsa.onrender.com","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/marcode24.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-11-28T02:34:26.000Z","updated_at":"2024-02-07T19:27:25.000Z","dependencies_parsed_at":null,"dependency_job_id":"31f04982-b1ca-412a-a70b-51df1ac02451","html_url":"https://github.com/marcode24/criptografia-rsa","commit_stats":null,"previous_names":["marcode24/criptografia-rsa"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/marcode24/criptografia-rsa","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marcode24%2Fcriptografia-rsa","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marcode24%2Fcriptografia-rsa/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marcode24%2Fcriptografia-rsa/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marcode24%2Fcriptografia-rsa/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/marcode24","download_url":"https://codeload.github.com/marcode24/criptografia-rsa/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marcode24%2Fcriptografia-rsa/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31667034,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-10T17:19:37.612Z","status":"online","status_checked_at":"2026-04-11T02:00:05.776Z","response_time":54,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cryptography","css","html","html-css-javascript","html5-css3","javascript","multer","nodejs","rsa","rsa-cryptography"],"created_at":"2024-12-09T13:18:33.035Z","updated_at":"2026-04-11T02:49:13.586Z","avatar_url":"https://github.com/marcode24.png","language":"JavaScript","readme":"\u003cdiv align=\"center\"\u003e\n  \u003ch1\u003e🔐 Criptografía - RSA\u003c/h1\u003e\n\n  [Demo](https://criptografia-rsa.onrender.com)\n\n  ![Version](https://img.shields.io/github/package-json/v/marcode24/criptografia-rsa?style=popout\u0026logo=npm)\n  ![GitHub CI Workflow Status](https://img.shields.io/github/actions/workflow/status/marcode24/criptografia-rsa/linter.yml?branch=main\u0026style=popout\u0026logo=testcafe\u0026label=linter)\n  ![GitHub repo size](https://img.shields.io/github/repo-size/marcode24/criptografia-rsa?style=popout\u0026logo=github\u0026label=repo%20size)\n  ![GitHub](https://img.shields.io/github/license/marcode24/criptografia-rsa?style=popout\u0026logo=github\u0026label=license)\n  ![GitHub Repo stars](https://img.shields.io/github/stars/marcode24/criptografia-rsa?style=popout\u0026logo=apachespark\u0026color=yellow\u0026logoColor=yellow)\n  ![Github repo views](https://img.shields.io/github/search/marcode24/criptografia-rsa/criptografia-rsa?style=popout\u0026logo=github\u0026label=repo%20views)\n  ![GitHub last commit](https://img.shields.io/github/last-commit/marcode24/criptografia-rsa?style=popout\u0026logo=git\u0026label=last%20commit)\n\u003c/div\u003e\n\n## 📝 Requisitos\n\n- [![Node](https://img.shields.io/badge/Node-gray?style=popout\u0026logo=node.js)](https://nodejs.org/en/)\n- [![NPM](https://img.shields.io/badge/NPM-blue?style=popout\u0026logo=npm)](https://www.npmjs.com/)\n- [![Git](https://img.shields.io/badge/Git-gray?style=popout\u0026logo=git)](https://git-scm.com/)\n\nOptional tools:\n\n- [![Visual Studio Code](https://img.shields.io/badge/Visual%20Studio%20Code-blue?style=popout\u0026logo=visual-studio-code)](https://code.visualstudio.com/)\n- [![Postman](https://img.shields.io/badge/Postman-orange?style=popout\u0026logo=postman\u0026color=black)](https://www.postman.com/)\n\n## 🚀 Instalación\n\n```bash\n# Clonar el repositorio\n$ git clone https://github.com/marcode24/criptografia-rsa.git\n\n# Entrar al directorio del proyecto\n$ cd criptografia-rsa\n\n# Instalar las dependencias\n$ npm install\n\n# Preparar husky\n$ npm run prepare\n\n# Iniciar el servidor de desarrollo\n$ npm run start:dev\n```\n\n**Nota:** El servidor necesita un archivo `.env` con las siguientes variables de entorno:\n\n```bash\n# Puerto del servidor\nPORT=3000\n# AUTH_USER que se usará para autenticar al usuario\nAUTH_USER=marcode24\n# AUTH_PASSWORD que se usará para autenticar al usuario\nAUTH_PASSWORD=123456\n#JW_SECRET que se usará para firmar el token\nJWT_SECRET=secret\n```\n\n**Nota:**Como buena practica se necesitaría alojarlo en algun lugar mas seguro, pero para este caso se usará un archivo `.env`\n\n## 📚 Explicación\n\n**El problema es el siguiente:**\n\nRealizar una aplicación con interfaz gráfica que pida un inicio de sesión para un usuario, una\nvez iniciada la sesión al usuario se le desplegará un menú de 2 opciones el cual se verá de\nla siguiente manera:\n\n1. Cifrado RSA\n2. Descifrado RSA\n\nEl cifrado que se implementará en esta ocasión será el “RSA”, para obtener más información\nacerca de lo que es RSA pueden visitar el siguiente link https://searchsecurity.techtarget.com/definition/RSA\n\nAl insertar la opción 1 del menú se deberá desplegar un selector de archivos y escoger el\narchivo que a continuación se adjuntará “cifrar.txt”, el cual contendrá los datos a cifrar\nobtener su contenido y guardar un nuevo archivo que incluya la extensión “.rsa” con la\nnueva información cifrada.\n\nPosteriormente al seleccionar la opción 2 de nuestro menú se deberá de abrir el selector de\narchivos y escoger ese mismo archivo generado en el punto 1 para descifrarlo y mostrar en\npantalla el contenido del mismo en texto claro.\n\nPara la realización de esta práctica se deberá de elaborar un video el cual explique el\nprocedimiento que se está llevando a cabo durante el cifrado y descifrado del archivo en\ncomento, incluir en el video cómo se generó el archivo con extensión “.rsa” y su contenido,\nasí mismo para el archivo descifrado, se deberá de mostrar la generación de ese nuevo\ndocumento y su contenido.\n\n- Para la elaboración del cifrado se deberá de generar una llave pública de 4096 bit\n- Para la elaboración del descifrado una llave privada de 4096 bit\n- Para la elaboración de esta práctica se puede hacer uso de las librerías destinadas\npara RSA\n- El lenguaje de programación será el que ustedes elijan\n- Entregar código fuente\n\n## 📝 Solución\n\nPara la solución de este problema se usó el lenguaje de programación `JavaScript` con el framework `Node.js` y las siguientes librerías:\n\n- [![Express](https://img.shields.io/badge/Express-gray?style=popout\u0026logo=express)](https://expressjs.com/)\n- [![Dotenv](https://img.shields.io/badge/Dotenv-gray?style=popout\u0026logo=npm)](https://www.npmjs.com/package/dotenv)\n- [![Jsonwebtoken](https://img.shields.io/badge/Jsonwebtoken-gray?style=popout\u0026logo=npm)](https://www.npmjs.com/package/jsonwebtoken)\n- [![Multer](https://img.shields.io/badge/Multer-gray?style=popout\u0026logo=npm)](https://www.npmjs.com/package/multer)\n\n1. Para la autenticación se usó el método `Basic Auth` de `HTTP` con las variables de entorno `AUTH_USER` y `AUTH_PASSWORD` para el usuario y contraseña respectivamente. Para esto se usó la librería `Dotenv` para cargar las variables de entorno desde el archivo `.env` y la librería `Jsonwebtoken` para generar el token de autenticación. El token se genera con el método `sign` de la librería `Jsonwebtoken` y se envía en las cookies de la respuesta con el método `cookie` de la librería `Express`.\n\n2. Para el cifrado nos enfocaremos en el archivo `src/utils/rsa.js`\n\n```js\nimport crypto from 'crypto';\nimport fs from 'fs';\n\nconst generateKeyPair = () =\u003e {\n  try {\n    const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', {\n      modulusLength: 4096,\n      publicKeyEncoding: {\n        type: 'spki',\n        format: 'pem',\n      },\n      privateKeyEncoding: {\n        type: 'pkcs8',\n        format: 'pem',\n      },\n    });\n\n    fs.writeFileSync('public_key.pem', publicKey);\n    fs.writeFileSync('private_key.pem', privateKey);\n  } catch (error) {\n    // eslint-disable-next-line no-console\n    console.error('Error generando el par de claves:', error);\n    throw error;\n  }\n};\n\nconst encryptData = (data) =\u003e {\n  const PUBLIC_KEY = fs.readFileSync('public_key.pem', 'utf-8');\n  try {\n    const MAX_SIZE = 245; // Tamaño máximo para cifrar con RSA de 4096 bits\n    const encryptChunkWithRSA = (chunk) =\u003e crypto.publicEncrypt({\n      key: PUBLIC_KEY,\n      padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,\n    }, Buffer.from(chunk, 'utf-8'));\n\n    return Array.from({ length: Math.ceil(data.length / MAX_SIZE) }, (_, i) =\u003e {\n      const start = i * MAX_SIZE;\n      const end = start + MAX_SIZE;\n      return encryptChunkWithRSA(data.slice(start, end));\n    });\n  } catch (error) {\n    // eslint-disable-next-line no-console\n    console.error('Error durante el cifrado:', error);\n    throw error; // Puedes manejar el error según tus necesidades\n  }\n};\n\nfunction decryptData(data) {\n  const PRIVATE_KEY = fs.readFileSync('private_key.pem', 'utf-8');\n  try {\n    const CHUNK_SIZE = 512;\n    const chunks = [];\n\n    for (let i = 0; i \u003c data.length; i += CHUNK_SIZE) {\n      const chunk = data.slice(i, i + CHUNK_SIZE);\n      const decryptedBuffer = crypto.privateDecrypt({\n        key: PRIVATE_KEY,\n        padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,\n      }, chunk);\n\n      chunks.push(decryptedBuffer);\n    }\n\n    return Buffer.concat(chunks).toString('utf-8');\n  } catch (error) {\n    // eslint-disable-next-line no-console\n    console.error('Error durante el descifrado:', error);\n    throw error; // Puedes manejar el error según tus necesidades\n  }\n}\n\nexport {\n  generateKeyPair,\n  encryptData,\n  decryptData,\n};\n\n```\n\n- Primeramente se genera el par de claves con el método `generateKeyPairSync` de la librería `crypto` y se guardan en los archivos `public_key.pem` y `private_key.pem` con el método `writeFileSync` de la librería `fs`. Aqui se usó el algoritmo `RSA` con una longitud de 4096 bits.\n\n```js\nconst generateKeyPair = () =\u003e {\n  try {\n    const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', {\n      modulusLength: 4096,\n      publicKeyEncoding: {\n        type: 'spki',\n        format: 'pem',\n      },\n      privateKeyEncoding: {\n        type: 'pkcs8',\n        format: 'pem',\n      },\n    });\n\n    fs.writeFileSync('public_key.pem', publicKey);\n    fs.writeFileSync('private_key.pem', privateKey);\n  } catch (error) {\n    // eslint-disable-next-line no-console\n    console.error('Error generando el par de claves:', error);\n    throw error;\n  }\n};\n```\n\n- Para el cifrado se usó el método `publicEncrypt` de la librería `crypto` con el algoritmo `RSA_PKCS1_OAEP_PADDING` y el tamaño máximo de datos a cifrar es de 245 bytes. Para esto se usó el método `readFileSync` de la librería `fs` para leer el archivo `public_key.pem` y obtener la llave pública.\n\n```js\nconst encryptData = (data) =\u003e {\n  const PUBLIC_KEY = fs.readFileSync('public_key.pem', 'utf-8');\n  try {\n    const MAX_SIZE = 245; // Tamaño máximo para cifrar con RSA de 4096 bits\n    const encryptChunkWithRSA = (chunk) =\u003e crypto.publicEncrypt({\n      key: PUBLIC_KEY,\n      padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,\n    }, Buffer.from(chunk, 'utf-8'));\n\n    return Array.from({ length: Math.ceil(data.length / MAX_SIZE) }, (_, i) =\u003e {\n      const start = i * MAX_SIZE;\n      const end = start + MAX_SIZE;\n      return encryptChunkWithRSA(data.slice(start, end));\n    });\n  } catch (error) {\n    // eslint-disable-next-line no-console\n    console.error('Error durante el cifrado:', error);\n    throw error; // Puedes manejar el error según tus necesidades\n  }\n};\n```\n\n- Para el descifrado se usó el método `privateDecrypt` de la librería `crypto` con el algoritmo `RSA_PKCS1_OAEP_PADDING` y el tamaño máximo de datos a descifrar es de 512 bytes. Para esto se usó el método `readFileSync` de la librería `fs` para leer el archivo `private_key.pem` y obtener la llave privada.\n\n```js\nfunction decryptData(data) {\n  const PRIVATE_KEY = fs.readFileSync('private_key.pem', 'utf-8');\n  try {\n    const CHUNK_SIZE = 512;\n    const chunks = [];\n\n    for (let i = 0; i \u003c data.length; i += CHUNK_SIZE) {\n      const chunk = data.slice(i, i + CHUNK_SIZE);\n      const decryptedBuffer = crypto.privateDecrypt({\n        key: PRIVATE_KEY,\n        padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,\n      }, chunk);\n\n      chunks.push(decryptedBuffer);\n    }\n\n    return Buffer.concat(chunks).toString('utf-8');\n  } catch (error) {\n    // eslint-disable-next-line no-console\n    console.error('Error durante el descifrado:', error);\n    throw error; // Puedes manejar el error según tus necesidades\n  }\n}\n```\n\n3. Para el cifrado y descifrado de archivos se usó la librería `Multer` para subir los archivos al servidor y la librería `fs` para leer y escribir los archivos.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarcode24%2Fcriptografia-rsa","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmarcode24%2Fcriptografia-rsa","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarcode24%2Fcriptografia-rsa/lists"}