Why not just treat resistance as some kind of percentage reduction? For example, a piece of armor could have 50% damage reduction. This would mean exactly what it says: only 50% of the damage of the weapon is done to the armor. Stacking could work multiplicatively in terms of damage received. For a single 50% reduction, 100-50% = 50% taken. For two pieces (1-0.5)(1-0.5) =0.50.5=0.25 (25%) is taken. This naturally incurs a penalty, as it will reduce in effectiveness as it approaches 0% taken (50, 25, 12.5, 6.25, etc). Armor with less reduction would stack even worse (for 25% reduction, taken would be 75%, 56%, 42%, 32%, etc.), encouraging the use of the heavier, more expensive armor when stacking, and leaving ships that don’t have heavy armor (e.g. fighters) without the ability to become ridiculously armored through stacking.
If you want to prevent tanks from being invincible while also making even basic armor useful, you could make the damage taken be some function of the difference between AP and AR. For example, damage taken = 0.5 * (AP^2-AR^2). When AP=AR, damage taken is 50%. As AP>AR, armor quickly becomes ineffective, though continuing to offer some small amount of protection. Conversely, AP<AR would give a lot of protection while still allowing some damage to get through. In the case of a fighter vs. a cruiser, a heavily armored cruiser wouldn’t be invincible to fighters, but would seriously hamper their progress as they slowly pitted through the armor, encouraging using heavier weapons against armored targets, while still leaving an unarmored (or weakly armored) cruiser very susceptible to fast fighter fire (say that three times fast!). Conversely, an armored fighter still wouldn’t stand much of a chance against high AP weapons, but could still take a hit or two from weaker, shield-busting weapons (making fighter armor a viable option).
No matter the case, this would eliminate the need for a crit system, which really just adds random chance to an otherwise numerical battle.