![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
|
|
#1
|
||||
|
||||
|
Que tal si planteas *primero* que quieres?
Aunque seguro es tecnicamente posible reproducir el algoritmo (como usando Reflector para ver el codigo fuente en .NET) la verdad tampoco le veo el sentido a depender de una funcion aleatoria...
__________________
El malabarista. |
|
#2
|
|||
|
|||
|
Nuevamente, La aplicación que se esta utilizando en varios lugares esta en VB.net, se esta cambiando por partes, me encontré que utilizaban random para generar una key. Como se esta cambiando a Delphi y mis jefes quieren trabajar con esa esquema de generar key. (el que sabe sabe y el que no es jefe). El esquema es muy fácil, una fecha se cambia a formato juliano y se descompone en los diferentes dígito, lo cuales se buscan en una cadena de caracteres y se combinan para crear una key de 31 de largo, en donde esta la fecha y la semilla y otros caracteres que se chequean. Los cuales salen tambien de la semilla. JC
|
|
#3
|
||||
|
||||
|
Cita:
Si realmente deseas obtener la misma secuencia de los resultados no emples randomize e ingresa SIEMPPRE el mismo valor de semilla. Ha decir verdad no se si será posible obtener los mismos resultados que en VB. En cuanto a lo que dice seoane sobre técnicas de encriptación: Cita:
Tengo entendido que el AES es casi inviolable. Encontrarle la solución por fuerza bruta requerirá de años o décadas.Cita:
Saludos, |
|
#4
|
|||
|
|||
|
Es una aplicación desarrollada en VB, la cual esta siendo utilizada.
Mi jefe quiere que sigamos con el mismo esquema en la validación. Hice la validación en Delphi, pero al momento de probar la key generada en nuevo programa no salía bien. Le explique a mi jefe que al ser distintos compiladores (VB y Delphi) generan con una secuencia distinta. He leido que existen más de 10 metodos para generar el Random, he probado 5 y ninguna sale la misma secuencia. Cita:
Existirá una API que maneje el Random!.. JC ![]() |
|
#5
|
|||
|
|||
|
Metodos y funciones para generar numeros aleatorios hay infinitos, y cualquiera se puede inventar una nuevo algoritmo para generarlos.
En tu caso solo veo dos opciones: - Preguntar a microsoft por el algoritmo que usan ellos, veo dificil que te respondan pero bueno. - Si las semillas a utilizar son pocas, asi como la lista de valores es pequeña, usando el programa original generar una tabla con la lista de valores posibles que generan todas las posibles semillas y utilizar esa tabla en el programa en delphi, en definitiva tener precalculados todos los posibles resultados. Es mas estos numeros precalculados los utilizaria incluso en el programa original, es una locura generar numeros aleatorios y cruzar los dedos para que siga funcionando bien el sistema todos los dias, ese programa estaria jugando a la ruleta rusa, hoy fallara hoy no fallara ? Hoy decidira microsoft en alguna actualizacion mejorar la libreria de generacion de numeros cambiando el algoritmo y me mandara a la mierda el funcionamiento del programa que tengo instalado en cientos de clientes, si no es hoy sera mañana, dentro de un mes ? Lo siento, pero quien decidio usar ese sistema realmente le quedo la cabeza descansada !!!!!!!!!! Saludos Última edición por Mick fecha: 06-03-2007 a las 23:25:14. |
|
#6
|
||||
|
||||
|
No hay necesidad de preguntarle a MS.
El codigo desensamblado es mas o menos asi:
NOTA: Es solo una porcion y el desemsamblaje no es perfecto. Ahora, para una mejor aproximacion quizas el codigo de MONO nos sirva: Código:
public class Random
{
const int MBIG = int.MaxValue;
const int MSEED = 161803398;
const int MZ = 0;
int inext, inextp;
int [] SeedArray = new int [56];
public Random ()
: this (Environment.TickCount)
{
}
public Random (int Seed)
{
int ii;
int mj, mk;
// Numerical Recipes in C online @ http://www.library.cornell.edu/nr/bookcpdf/c7-1.pdf
mj = MSEED - Math.Abs (Seed);
SeedArray [55] = mj;
mk = 1;
for (int i = 1; i < 55; i++) { // [1, 55] is special (Knuth)
ii = (21 * i) % 55;
SeedArray [ii] = mk;
mk = mj - mk;
if (mk < 0)
mk += MBIG;
mj = SeedArray [ii];
}
for (int k = 1; k < 5; k++) {
for (int i = 1; i < 56; i++) {
SeedArray [i] -= SeedArray [1 + (i + 30) % 55];
if (SeedArray [i] < 0)
SeedArray [i] += MBIG;
}
}
inext = 0;
inextp = 31;
}
protected virtual double Sample ()
{
int retVal;
if (++inext >= 56) inext = 1;
if (++inextp >= 56) inextp = 1;
retVal = SeedArray [inext] - SeedArray [inextp];
if (retVal < 0)
retVal += MBIG;
SeedArray [inext] = retVal;
return retVal * (1.0 / MBIG);
}
public virtual int Next ()
{
return (int)(Sample () * int.MaxValue);
}
public virtual int Next (int maxValue)
{
if (maxValue < 0)
throw new ArgumentOutOfRangeException(Locale.GetText (
"Max value is less then min value."));
return (int)(Sample () * maxValue);
}
public virtual int Next (int minValue, int maxValue)
{
if (minValue > maxValue)
throw new ArgumentOutOfRangeException (Locale.GetText (
"Min value is greater then max value."));
uint diff = (uint)(maxValue - minValue);
if (diff == 0)
return minValue;
int result = (int)(Sample () * diff + minValue);
return ((result != maxValue) ? result : (result - 1));
}
public virtual void NextBytes (byte [] buffer)
{
if (buffer == null)
throw new ArgumentNullException ("buffer");
for (int i = 0; i < buffer.Length; i++) {
buffer [i] = (byte)(Sample () * (byte.MaxValue + 1));
}
}
public virtual double NextDouble ()
{
return this.Sample ();
}
}
__________________
El malabarista. Última edición por mamcx fecha: 07-03-2007 a las 16:59:13. |
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
Temas Similares
|
||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| Aprender a ser como tu enemigo | DarkByte | Debates | 3 | 26-05-2004 19:43:50 |
|